[INFO] cloning repository https://github.com/fewzfewz/Torrent
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/fewzfewz/Torrent" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ffewzfewz%2FTorrent", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ffewzfewz%2FTorrent'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 0ea723b3e9fe188ae83fa3de82de73d7cc893e09
[INFO] testing fewzfewz/Torrent against master#cced03bfd61a304243a34504618ecec86c17063f for pr-154065-2
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ffewzfewz%2FTorrent" "/workspace/builds/worker-0-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-0-tc1/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/fewzfewz/Torrent
[INFO] finished tweaking git repo https://github.com/fewzfewz/Torrent
[INFO] tweaked toml for git repo https://github.com/fewzfewz/Torrent written to /workspace/builds/worker-0-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/fewzfewz/Torrent on toolchain cced03bfd61a304243a34504618ecec86c17063f
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/fewzfewz/Torrent already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded system-configuration v0.5.1
[INFO] [stderr]   Downloaded system-configuration-sys v0.5.0
[INFO] [stderr]   Downloaded strum v0.25.0
[INFO] [stderr]   Downloaded assert-json-diff v2.0.2
[INFO] [stderr]   Downloaded waker-fn v1.2.0
[INFO] [stderr]   Downloaded fastrand v1.9.0
[INFO] [stderr]   Downloaded infer v0.2.3
[INFO] [stderr]   Downloaded dialoguer v0.11.0
[INFO] [stderr]   Downloaded dashmap v5.5.3
[INFO] [stderr]   Downloaded pest_generator v2.8.6
[INFO] [stderr]   Downloaded assert_cmd v2.2.0
[INFO] [stderr]   Downloaded wiremock v0.5.22
[INFO] [stderr]   Downloaded compression-core v0.4.31
[INFO] [stderr]   Downloaded reqwest v0.11.27
[INFO] [stderr]   Downloaded retain_mut v0.1.9
[INFO] [stderr]   Downloaded deadpool-runtime v0.1.4
[INFO] [stderr]   Downloaded deadpool v0.9.5
[INFO] [stderr]   Downloaded serde_qs v0.8.5
[INFO] [stderr]   Downloaded simple_asn1 v0.6.4
[INFO] [stderr]   Downloaded neli-proc-macros v0.2.2
[INFO] [stderr]   Downloaded signal-hook-tokio v0.3.1
[INFO] [stderr]   Downloaded dns-lookup v2.1.1
[INFO] [stderr]   Downloaded pest_derive v2.8.6
[INFO] [stderr]   Downloaded getset v0.1.6
[INFO] [stderr]   Downloaded strum_macros v0.25.3
[INFO] [stderr]   Downloaded yaml-rust v0.4.5
[INFO] [stderr]   Downloaded uuid v1.22.0
[INFO] [stderr]   Downloaded futures-lite v1.13.0
[INFO] [stderr]   Downloaded compression-codecs v0.4.37
[INFO] [stderr]   Downloaded local-ip-address v0.6.10
[INFO] [stderr]   Downloaded igd-next v0.14.3
[INFO] [stderr]   Downloaded config v0.13.4
[INFO] [stderr]   Downloaded toml v0.5.11
[INFO] [stderr]   Downloaded arc-swap v1.8.2
[INFO] [stderr]   Downloaded axum-extra v0.9.6
[INFO] [stderr]   Downloaded multer v3.1.0
[INFO] [stderr]   Downloaded axum-macros v0.4.2
[INFO] [stderr]   Downloaded ron v0.7.1
[INFO] [stderr]   Downloaded neli v0.7.4
[INFO] [stderr]   Downloaded async-compression v0.4.41
[INFO] [stderr]   Downloaded tower v0.4.13
[INFO] [stderr]   Downloaded tower-http v0.5.2
[INFO] [stderr]   Downloaded sysinfo v0.30.13
[INFO] [stderr]   Downloaded ratatui v0.24.0
[INFO] [stderr]   Downloaded nix v0.27.1
[INFO] [stderr]   Downloaded zstd-sys v2.0.16+zstd.1.5.7
[INFO] [stderr]   Downloaded http-types v2.12.0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] d014242b5515a9ac7fe176947255e41227115acd5ffb059c61cc45114cbdd5c6
[INFO] running `Command { std: "docker" "start" "-a" "d014242b5515a9ac7fe176947255e41227115acd5ffb059c61cc45114cbdd5c6", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "d014242b5515a9ac7fe176947255e41227115acd5ffb059c61cc45114cbdd5c6", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "d014242b5515a9ac7fe176947255e41227115acd5ffb059c61cc45114cbdd5c6", kill_on_drop: false }`
[INFO] [stdout] d014242b5515a9ac7fe176947255e41227115acd5ffb059c61cc45114cbdd5c6
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 5995a6b33fcb059d7e44b159c0abec76e080089fd6d2f609b3729d3a22906a6e
[INFO] running `Command { std: "docker" "start" "-a" "5995a6b33fcb059d7e44b159c0abec76e080089fd6d2f609b3729d3a22906a6e", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.183
[INFO] [stderr]    Compiling smallvec v1.15.1
[INFO] [stderr]    Compiling once_cell v1.21.3
[INFO] [stderr]    Compiling memchr v2.8.0
[INFO] [stderr]    Compiling log v0.4.29
[INFO] [stderr]    Compiling bytes v1.11.1
[INFO] [stderr]    Compiling pin-project-lite v0.2.17
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling lock_api v0.4.14
[INFO] [stderr]    Compiling find-msvc-tools v0.1.9
[INFO] [stderr]    Compiling futures-core v0.3.32
[INFO] [stderr]    Compiling pkg-config v0.3.32
[INFO] [stderr]    Compiling futures-sink v0.3.32
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]    Compiling stable_deref_trait v1.2.1
[INFO] [stderr]    Compiling slab v0.4.12
[INFO] [stderr]    Compiling futures-channel v0.3.32
[INFO] [stderr]    Compiling futures-task v0.3.32
[INFO] [stderr]    Compiling futures-io v0.3.32
[INFO] [stderr]    Compiling bitflags v2.11.0
[INFO] [stderr]    Compiling typenum v1.19.0
[INFO] [stderr]    Compiling httparse v1.10.1
[INFO] [stderr]    Compiling http v1.4.0
[INFO] [stderr]    Compiling rustversion v1.0.22
[INFO] [stderr]    Compiling writeable v0.6.2
[INFO] [stderr]    Compiling litemap v0.8.1
[INFO] [stderr]    Compiling jobserver v0.1.34
[INFO] [stderr]    Compiling thiserror v1.0.69
[INFO] [stderr]    Compiling icu_normalizer_data v2.1.1
[INFO] [stderr]    Compiling cc v1.2.56
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]    Compiling icu_properties_data v2.1.2
[INFO] [stderr]    Compiling percent-encoding v2.3.2
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling socket2 v0.6.3
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling mio v1.1.1
[INFO] [stderr]    Compiling getrandom v0.2.17
[INFO] [stderr]    Compiling generic-array v0.14.7
[INFO] [stderr]    Compiling rand_core v0.6.4
[INFO] [stderr]    Compiling form_urlencoded v1.2.2
[INFO] [stderr]    Compiling crypto-common v0.1.7
[INFO] [stderr]    Compiling block-buffer v0.10.4
[INFO] [stderr]    Compiling http v0.2.12
[INFO] [stderr]    Compiling ahash v0.7.8
[INFO] [stderr]    Compiling digest v0.10.7
[INFO] [stderr]    Compiling ucd-trie v0.1.7
[INFO] [stderr]    Compiling httpdate v1.0.3
[INFO] [stderr]    Compiling rand_chacha v0.3.1
[INFO] [stderr]    Compiling pest v2.8.6
[INFO] [stderr]    Compiling cpufeatures v0.2.17
[INFO] [stderr]    Compiling openssl v0.10.75
[INFO] [stderr]    Compiling rand v0.8.5
[INFO] [stderr]    Compiling http-body v1.0.1
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling openssl-sys v0.9.111
[INFO] [stderr]    Compiling zstd-sys v2.0.16+zstd.1.5.7
[INFO] [stderr]    Compiling tower-layer v0.3.3
[INFO] [stderr]    Compiling native-tls v0.2.18
[INFO] [stderr]    Compiling hashbrown v0.12.3
[INFO] [stderr]    Compiling sha1 v0.10.6
[INFO] [stderr]    Compiling ipnet v2.12.0
[INFO] [stderr]    Compiling ryu v1.0.23
[INFO] [stderr]    Compiling zstd-safe v7.2.4
[INFO] [stderr]    Compiling option-ext v0.2.0
[INFO] [stderr]    Compiling ident_case v1.0.1
[INFO] [stderr]    Compiling alloc-no-stdlib v2.0.4
[INFO] [stderr]    Compiling dlv-list v0.3.0
[INFO] [stderr]    Compiling openssl-probe v0.2.1
[INFO] [stderr]    Compiling pest_meta v2.8.6
[INFO] [stderr]    Compiling alloc-stdlib v0.2.2
[INFO] [stderr]    Compiling ordered-multimap v0.4.3
[INFO] [stderr]    Compiling dirs-sys v0.4.1
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling http-body v0.4.6
[INFO] [stderr]    Compiling synstructure v0.13.2
[INFO] [stderr]    Compiling darling_core v0.20.11
[INFO] [stderr]    Compiling socket2 v0.5.10
[INFO] [stderr]    Compiling encoding_rs v0.8.35
[INFO] [stderr]    Compiling minimal-lexical v0.2.1
[INFO] [stderr]    Compiling pest_generator v2.8.6
[INFO] [stderr]    Compiling base64 v0.13.1
[INFO] [stderr]    Compiling linked-hash-map v0.5.6
[INFO] [stderr]    Compiling radium v0.7.0
[INFO] [stderr]    Compiling signal-hook v0.3.18
[INFO] [stderr]    Compiling simd-adler32 v0.3.8
[INFO] [stderr]    Compiling anyhow v1.0.102
[INFO] [stderr]    Compiling miniz_oxide v0.8.9
[INFO] [stderr]    Compiling yaml-rust v0.4.5
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling tokio-macros v2.6.1
[INFO] [stderr]    Compiling zerofrom-derive v0.1.6
[INFO] [stderr]    Compiling tokio v1.50.0
[INFO] [stderr]    Compiling yoke-derive v0.8.1
[INFO] [stderr]    Compiling tracing-attributes v0.1.31
[INFO] [stderr]    Compiling zerovec-derive v0.11.2
[INFO] [stderr]    Compiling zerofrom v0.1.6
[INFO] [stderr]    Compiling futures-macro v0.3.32
[INFO] [stderr]    Compiling yoke v0.8.1
[INFO] [stderr]    Compiling displaydoc v0.2.5
[INFO] [stderr]    Compiling tracing v0.1.44
[INFO] [stderr]    Compiling zerovec v0.11.5
[INFO] [stderr]    Compiling futures-util v0.3.32
[INFO] [stderr]    Compiling thiserror-impl v1.0.69
[INFO] [stderr]    Compiling zerotrie v0.2.3
[INFO] [stderr]    Compiling openssl-macros v0.1.1
[INFO] [stderr]    Compiling async-trait v0.1.89
[INFO] [stderr]    Compiling tinystr v0.8.2
[INFO] [stderr]    Compiling icu_locale_core v2.1.1
[INFO] [stderr]    Compiling potential_utf v0.1.4
[INFO] [stderr]    Compiling pest_derive v2.8.6
[INFO] [stderr]    Compiling icu_collections v2.1.1
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling darling_macro v0.20.11
[INFO] [stderr]    Compiling icu_provider v2.1.1
[INFO] [stderr]    Compiling icu_properties v2.1.2
[INFO] [stderr]    Compiling icu_normalizer v2.1.1
[INFO] [stderr]    Compiling serde_urlencoded v0.7.1
[INFO] [stderr]    Compiling toml_datetime v0.6.11
[INFO] [stderr]    Compiling serde_spanned v0.6.9
[INFO] [stderr]    Compiling toml_edit v0.22.27
[INFO] [stderr]    Compiling ron v0.7.1
[INFO] [stderr]    Compiling toml v0.5.11
[INFO] [stderr]    Compiling idna_adapter v1.2.1
[INFO] [stderr]    Compiling json5 v0.4.1
[INFO] [stderr]    Compiling idna v1.1.0
[INFO] [stderr]    Compiling tokio-util v0.7.18
[INFO] [stderr]    Compiling url v2.5.8
[INFO] [stderr]    Compiling h2 v0.3.27
[INFO] [stderr]    Compiling h2 v0.4.13
[INFO] [stderr]    Compiling tokio-native-tls v0.3.1
[INFO] [stderr]    Compiling tracing-serde v0.2.0
[INFO] [stderr]    Compiling matchers v0.2.0
[INFO] [stderr]    Compiling nom v7.1.3
[INFO] [stderr]    Compiling rust-ini v0.18.0
[INFO] [stderr]    Compiling brotli-decompressor v5.0.0
[INFO] [stderr]    Compiling lru v0.12.5
[INFO] [stderr]    Compiling http-body-util v0.1.3
[INFO] [stderr]    Compiling tracing-log v0.2.0
[INFO] [stderr]    Compiling thread_local v1.1.9
[INFO] [stderr]    Compiling time-core v0.1.8
[INFO] [stderr]    Compiling nu-ansi-term v0.50.3
[INFO] [stderr]    Compiling base64 v0.21.7
[INFO] [stderr]    Compiling data-encoding v2.10.0
[INFO] [stderr]    Compiling sync_wrapper v1.0.2
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling humantime v2.3.0
[INFO] [stderr]    Compiling xml-rs v0.8.28
[INFO] [stderr]    Compiling iana-time-zone v0.1.65
[INFO] [stderr]    Compiling pathdiff v0.2.3
[INFO] [stderr]    Compiling tap v1.0.1
[INFO] [stderr]    Compiling num-conv v0.2.0
[INFO] [stderr]    Compiling utf-8 v0.7.6
[INFO] [stderr]    Compiling fastrand v2.3.0
[INFO] [stderr]    Compiling hashbrown v0.14.5
[INFO] [stderr]    Compiling tungstenite v0.24.0
[INFO] [stderr]    Compiling time-macros v0.2.27
[INFO] [stderr]    Compiling wyz v0.5.1
[INFO] [stderr]    Compiling xmltree v0.10.3
[INFO] [stderr]    Compiling chrono v0.4.44
[INFO] [stderr]    Compiling config v0.13.4
[INFO] [stderr]    Compiling humantime-serde v1.1.1
[INFO] [stderr]    Compiling dashmap v5.5.3
[INFO] [stderr]    Compiling deranged v0.5.8
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling rustls-pemfile v1.0.4
[INFO] [stderr]    Compiling brotli v8.0.2
[INFO] [stderr]    Compiling tracing-subscriber v0.3.22
[INFO] [stderr]    Compiling flate2 v1.1.9
[INFO] [stderr]    Compiling zstd v0.13.3
[INFO] [stderr]    Compiling hyper v0.14.32
[INFO] [stderr]    Compiling hyper v1.8.1
[INFO] [stderr]    Compiling attohttpc v0.24.1
[INFO] [stderr]    Compiling toml v0.8.23
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling bincode v1.3.3
[INFO] [stderr]    Compiling darling v0.20.11
[INFO] [stderr]    Compiling thiserror-impl v2.0.18
[INFO] [stderr]    Compiling dirs v5.0.1
[INFO] [stderr]    Compiling directories v5.0.1
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]    Compiling num-integer v0.1.46
[INFO] [stderr]    Compiling arc-swap v1.8.2
[INFO] [stderr]    Compiling num_cpus v1.17.0
[INFO] [stderr]    Compiling multer v3.1.0
[INFO] [stderr]    Compiling compression-core v0.4.31
[INFO] [stderr]    Compiling hex v0.4.3
[INFO] [stderr]    Compiling sync_wrapper v0.1.2
[INFO] [stderr]    Compiling funty v2.0.0
[INFO] [stderr]    Compiling protobuf v2.28.0
[INFO] [stderr]    Compiling unicase v2.9.0
[INFO] [stderr]    Compiling compression-codecs v0.4.37
[INFO] [stderr]    Compiling common v0.1.0 (/opt/rustwide/workdir/crates/common)
[INFO] [stderr]    Compiling num-bigint v0.4.6
[INFO] [stderr]    Compiling hyper-util v0.1.20
[INFO] [stderr]    Compiling mime_guess v2.0.5
[INFO] [stderr]    Compiling bitvec v1.0.1
[INFO] [stderr]    Compiling hyper-tls v0.5.0
[INFO] [stderr]    Compiling reqwest v0.11.27
[INFO] [stderr]    Compiling derive_builder_core v0.20.2
[INFO] [stderr]    Compiling futures v0.3.32
[INFO] [stderr]    Compiling igd-next v0.14.3
[INFO] [stderr]    Compiling time v0.3.47
[INFO] [stderr]    Compiling tokio-tungstenite v0.24.0
[INFO] [stderr]    Compiling tower v0.5.3
[INFO] [stderr]    Compiling axum-core v0.4.5
[INFO] [stderr]    Compiling axum-macros v0.4.2
[INFO] [stderr]    Compiling uuid v1.22.0
[INFO] [stderr]    Compiling if-addrs v0.10.2
[INFO] [stderr]    Compiling serde_path_to_error v0.1.20
[INFO] [stderr]    Compiling proc-macro-error-attr2 v2.0.0
[INFO] [stderr]    Compiling untrusted v0.9.0
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling base64ct v1.8.3
[INFO] [stderr]    Compiling prometheus v0.13.4
[INFO] [stderr]    Compiling spin v0.9.8
[INFO] [stderr]    Compiling matchit v0.7.3
[INFO] [stderr]    Compiling urlencoding v2.1.3
[INFO] [stderr]    Compiling password-hash v0.5.0
[INFO] [stderr]    Compiling core v0.1.0 (/opt/rustwide/workdir/crates/core)
[INFO] [stderr]    Compiling simple_asn1 v0.6.4
[INFO] [stdout] warning: unused import: `std::path::PathBuf`
[INFO] [stdout]  --> crates/core/src/torrent.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use std::path::PathBuf;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Decoder` and `Value`
[INFO] [stdout]  --> crates/core/src/tracker.rs:4:22
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::bencode::{Decoder, Value};
[INFO] [stdout]   |                      ^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `BTreeMap`
[INFO] [stdout]  --> crates/core/src/dht/routing_table.rs:3:24
[INFO] [stdout]   |
[INFO] [stdout] 3 | use std::collections::{BTreeMap, VecDeque};
[INFO] [stdout]   |                        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]   --> crates/core/src/dht/query.rs:13:15
[INFO] [stdout]    |
[INFO] [stdout] 13 | use tracing::{debug, warn};
[INFO] [stdout]    |               ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `QueryManager`
[INFO] [stdout]  --> crates/core/src/dht/mod.rs:9:17
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use query::{QueryManager, QueryMessage};
[INFO] [stdout]   |                 ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Sha1`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:22:12
[INFO] [stdout]    |
[INFO] [stdout] 22 | use sha1::{Sha1, Digest};
[INFO] [stdout]    |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `BufMut`
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:325:23
[INFO] [stdout]     |
[INFO] [stdout] 325 | use bytes::{BytesMut, BufMut};
[INFO] [stdout]     |                       ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `BufMut` and `BytesMut`
[INFO] [stdout]  --> crates/core/src/peer/message.rs:3:13
[INFO] [stdout]   |
[INFO] [stdout] 3 | use bytes::{BytesMut, BufMut};
[INFO] [stdout]   |             ^^^^^^^^  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PeerMessageId`
[INFO] [stdout]   --> crates/core/src/peer/peer_wire.rs:93:35
[INFO] [stdout]    |
[INFO] [stdout] 93 | use super::message::{PeerMessage, PeerMessageId};
[INFO] [stdout]    |                                   ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `handshake::Handshake`
[INFO] [stdout]  --> crates/core/src/peer/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use handshake::Handshake;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `PeerMessageId` and `PeerMessage`
[INFO] [stdout]   --> crates/core/src/peer/mod.rs:10:19
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use message::{PeerMessage, PeerMessageId};
[INFO] [stdout]    |                   ^^^^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Path`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:6:17
[INFO] [stdout]   |
[INFO] [stdout] 6 | use std::path::{Path, PathBuf};
[INFO] [stdout]   |                 ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `RwLock`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:8:26
[INFO] [stdout]   |
[INFO] [stdout] 8 | use tokio::sync::{Mutex, RwLock};
[INFO] [stdout]   |                          ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:9:21
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::{info, debug};
[INFO] [stdout]   |                     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `VecDeque`
[INFO] [stdout]  --> crates/core/src/pieces/piece_picker.rs:4:33
[INFO] [stdout]   |
[INFO] [stdout] 4 | use std::collections::{HashMap, VecDeque};
[INFO] [stdout]   |                                 ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::sync::Arc`
[INFO] [stdout]  --> crates/core/src/pieces/hash_checker.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use std::sync::Arc;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PieceInfo`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:7:39
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub use piece_manager::{PieceManager, PieceInfo};
[INFO] [stdout]   |                                       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `SelectionMode`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:8:37
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub use piece_picker::{PiecePicker, SelectionMode};
[INFO] [stdout]   |                                     ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `hash_checker::HashChecker`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use hash_checker::HashChecker;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::error::Error`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | use crate::error::Error;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `common::types::TorrentFile`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:12:5
[INFO] [stdout]    |
[INFO] [stdout] 12 | use common::types::TorrentFile;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::path::PathBuf`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 13 | use std::path::PathBuf;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::sync::Arc`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:14:5
[INFO] [stdout]    |
[INFO] [stdout] 14 | use std::sync::Arc;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tokio::sync::Mutex`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:15:5
[INFO] [stdout]    |
[INFO] [stdout] 15 | use tokio::sync::Mutex;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Path`
[INFO] [stdout]  --> crates/core/src/storage/disk_writer.rs:4:17
[INFO] [stdout]   |
[INFO] [stdout] 4 | use std::path::{Path, PathBuf};
[INFO] [stdout]   |                 ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]  --> crates/core/src/storage/disk_writer.rs:9:15
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::{debug, error};
[INFO] [stdout]   |               ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Mutex`
[INFO] [stdout]  --> crates/core/src/storage/file_manager.rs:9:19
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tokio::sync::{Mutex, RwLock};
[INFO] [stdout]   |                   ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `disk_writer::DiskWriter`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:7:9
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub use disk_writer::DiskWriter;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `memory_cache::MemoryCache`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:8:9
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub use memory_cache::MemoryCache;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `file_manager::FileManager`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use file_manager::FileManager;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PieceManager`
[INFO] [stdout]  --> crates/core/src/downloader.rs:5:21
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::pieces::{PieceManager, PiecePicker};
[INFO] [stdout]   |                     ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `TorrentState`
[INFO] [stdout]  --> crates/core/src/downloader.rs:8:31
[INFO] [stdout]   |
[INFO] [stdout] 8 | use common::types::{PeerInfo, TorrentState};
[INFO] [stdout]   |                               ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `mpsc`
[INFO] [stdout]   --> crates/core/src/downloader.rs:12:34
[INFO] [stdout]    |
[INFO] [stdout] 12 | use tokio::sync::{Mutex, RwLock, mpsc};
[INFO] [stdout]    |                                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::pieces::PieceManager`
[INFO] [stdout]  --> crates/core/src/uploader.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::pieces::PieceManager;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tokio::time`
[INFO] [stdout]  --> crates/core/src/uploader.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tokio::time;
[INFO] [stdout]   |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `info`
[INFO] [stdout]   --> crates/core/src/uploader.rs:10:22
[INFO] [stdout]    |
[INFO] [stdout] 10 | use tracing::{debug, info};
[INFO] [stdout]    |                      ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tracing::debug`
[INFO] [stdout]  --> crates/core/src/peer_discovery.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::debug;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `debug` and `info`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:11:15
[INFO] [stdout]    |
[INFO] [stdout] 11 | use tracing::{info, debug};
[INFO] [stdout]    |               ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:42:18
[INFO] [stdout]    |
[INFO] [stdout] 42 |         let (tx, mut rx) = mpsc::channel(1000);
[INFO] [stdout]    |                  ----^^
[INFO] [stdout]    |                  |
[INFO] [stdout]    |                  help: remove this `mut`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:414:17
[INFO] [stdout]     |
[INFO] [stdout] 414 |             let mut buf = BytesMut::with_capacity(4096);
[INFO] [stdout]     |                 ----^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:181:13
[INFO] [stdout]     |
[INFO] [stdout] 181 |         let mut piece_data = Vec::with_capacity(self.piece_length as usize);
[INFO] [stdout]     |             ----^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:220:13
[INFO] [stdout]     |
[INFO] [stdout] 220 |         let mut offset_in_piece = 0;
[INFO] [stdout]     |             ----^^^^^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling anstyle-parse v0.2.7
[INFO] [stderr]    Compiling proc-macro-error2 v2.0.1
[INFO] [stderr]    Compiling derive_builder_macro v0.20.2
[INFO] [stderr]    Compiling async-compression v0.4.41
[INFO] [stderr]    Compiling pem v3.0.6
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/lib.rs:440:13
[INFO] [stdout]     |
[INFO] [stdout] 440 |         for mut entry in self.torrents.iter_mut() {
[INFO] [stdout]     |             ----^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling axum v0.7.9
[INFO] [stderr]    Compiling blake2 v0.10.6
[INFO] [stdout] warning: unused import: `Digest`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:22:18
[INFO] [stdout]    |
[INFO] [stdout] 22 | use sha1::{Sha1, Digest};
[INFO] [stdout]    |                  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling mio v0.8.11
[INFO] [stdout] warning: unused variable: `addr`
[INFO] [stdout]    --> crates/core/src/dht/query.rs:220:26
[INFO] [stdout]     |
[INFO] [stdout] 220 |                 Ok((len, addr)) => {
[INFO] [stdout]     |                          ^^^^ help: if this is intentional, prefix it with an underscore: `_addr`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `msg`
[INFO] [stdout]    --> crates/core/src/dht/query.rs:200:71
[INFO] [stdout]     |
[INFO] [stdout] 200 |     async fn send_query(&self, transaction_id: u32, addr: SocketAddr, msg: QueryMessage) -> Result<(), Error> {
[INFO] [stdout]     |                                                                       ^^^ help: if this is intentional, prefix it with an underscore: `_msg`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `config`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:37:22
[INFO] [stdout]    |
[INFO] [stdout] 37 |     pub async fn new(config: &Config) -> Result<Self, Error> {
[INFO] [stdout]    |                      ^^^^^^ help: if this is intentional, prefix it with an underscore: `_config`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `port`
[INFO] [stdout]    --> crates/core/src/dht/mod.rs:114:61
[INFO] [stdout]     |
[INFO] [stdout] 114 |                 QueryMessage::AnnouncePeer { id, info_hash, port, .. } => {
[INFO] [stdout]     |                                                             ^^^^ help: try ignoring the field: `port: _`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `buf`
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:414:17
[INFO] [stdout]     |
[INFO] [stdout] 414 |             let mut buf = BytesMut::with_capacity(4096);
[INFO] [stdout]     |                 ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_buf`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `block_count`
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |         let block_count = (self.pieces[piece_index as usize].length as f64 / block_size as f64).ceil() as usize;
[INFO] [stdout]     |             ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_count`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `offset_in_piece`
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:220:13
[INFO] [stdout]     |
[INFO] [stdout] 220 |         let mut offset_in_piece = 0;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_offset_in_piece`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:91:13
[INFO] [stdout]    |
[INFO] [stdout] 91 |         let mut piece_rarity = vec![0; self.piece_count];
[INFO] [stdout]    |             ----^^^^^^^^^^^^
[INFO] [stdout]    |             |
[INFO] [stdout]    |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `piece_rarity`
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:91:13
[INFO] [stdout]    |
[INFO] [stdout] 91 |         let mut piece_rarity = vec![0; self.piece_count];
[INFO] [stdout]    |             ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_piece_rarity`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `piece_index`
[INFO] [stdout]   --> crates/core/src/pieces/hash_checker.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 58 |         piece_index: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_piece_index`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:113:9
[INFO] [stdout]     |
[INFO] [stdout] 113 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:114:9
[INFO] [stdout]     |
[INFO] [stdout] 114 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:133:9
[INFO] [stdout]     |
[INFO] [stdout] 133 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:134:9
[INFO] [stdout]     |
[INFO] [stdout] 134 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:160:9
[INFO] [stdout]     |
[INFO] [stdout] 160 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:161:9
[INFO] [stdout]     |
[INFO] [stdout] 161 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:184:9
[INFO] [stdout]     |
[INFO] [stdout] 184 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `old_key`
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:63:26
[INFO] [stdout]    |
[INFO] [stdout] 63 |             if let Some((old_key, old_entry)) = cache.pop_lru() {
[INFO] [stdout]    |                          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_old_key`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_start`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:59:21
[INFO] [stdout]    |
[INFO] [stdout] 59 |             let (_, file_start, file_end) = self.file_offsets.iter()
[INFO] [stdout]    |                     ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_start`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_offset`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:82:29
[INFO] [stdout]    |
[INFO] [stdout] 82 |             let (file_path, file_offset) = self.resolve_offset(current_pos)?;
[INFO] [stdout]    |                             ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_offset`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `writer`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:83:17
[INFO] [stdout]    |
[INFO] [stdout] 83 |             let writer = self.get_writer(&file_path).await?;
[INFO] [stdout]    |                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_writer`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_start`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:85:21
[INFO] [stdout]    |
[INFO] [stdout] 85 |             let (_, file_start, file_end) = self.file_offsets.iter()
[INFO] [stdout]    |                     ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_start`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peer`
[INFO] [stdout]    --> crates/core/src/downloader.rs:285:13
[INFO] [stdout]     |
[INFO] [stdout] 285 |         for peer in peers.iter() {
[INFO] [stdout]     |             ^^^^ help: if this is intentional, prefix it with an underscore: `_peer`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `stream`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:57:25
[INFO] [stdout]    |
[INFO] [stdout] 57 |                     Ok((stream, addr)) => {
[INFO] [stdout]    |                         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_stream`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `mgr`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:53:13
[INFO] [stdout]    |
[INFO] [stdout] 53 |         let mgr = self.clone();
[INFO] [stdout]    |             ^^^ help: if this is intentional, prefix it with an underscore: `_mgr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `connection`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:71:43
[INFO] [stdout]    |
[INFO] [stdout] 71 |     async fn handle_new_connection(&self, connection: PeerConnection) {
[INFO] [stdout]    |                                           ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_connection`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:62:38
[INFO] [stdout]    |
[INFO] [stdout] 62 |     async fn discover_via_dht(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:67:43
[INFO] [stdout]    |
[INFO] [stdout] 67 |     async fn discover_via_trackers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                           ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:72:38
[INFO] [stdout]    |
[INFO] [stdout] 72 |     async fn discover_via_lsd(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `max_age`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:89:37
[INFO] [stdout]    |
[INFO] [stdout] 89 |     pub async fn clear_stale(&self, max_age: std::time::Duration) {
[INFO] [stdout]    |                                     ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_max_age`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `torrents`
[INFO] [stdout]    --> crates/core/src/lib.rs:105:42
[INFO] [stdout]     |
[INFO] [stdout] 105 |     async fn load_state(config: &Config, torrents: &DashMap<String, TorrentHandle>) -> Result<()> {
[INFO] [stdout]     |                                          ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_torrents`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `download_path`
[INFO] [stdout]    --> crates/core/src/lib.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |         let download_path = self.config.paths.download_path.join(&name);
[INFO] [stdout]     |             ^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_download_path`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling either v1.15.0
[INFO] [stdout] warning: type `NodeStats` is more private than the item `NodeManager::stats`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:88:5
[INFO] [stdout]    |
[INFO] [stdout] 88 |     pub async fn stats(&self) -> NodeStats {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `NodeManager::stats` is reachable at visibility `pub`
[INFO] [stdout]    |
[INFO] [stdout] note: but type `NodeStats` is only usable at visibility `pub(self)`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:22:1
[INFO] [stdout]    |
[INFO] [stdout] 22 | struct NodeStats {
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^
[INFO] [stdout]    = note: `#[warn(private_interfaces)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `stats` is never read
[INFO] [stdout]   --> crates/core/src/lib.rs:43:5
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub struct BitTorrentClient {
[INFO] [stdout]    |            ---------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 43 |     stats: Arc<RwLock<ClientStats>>,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `BitTorrentClient` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ALPHABET` is never used
[INFO] [stdout]    --> crates/core/src/torrent.rs:309:11
[INFO] [stdout]     |
[INFO] [stdout] 309 |     const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
[INFO] [stdout]     |           ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ALPHABET` is never used
[INFO] [stdout]    --> crates/core/src/torrent.rs:313:11
[INFO] [stdout]     |
[INFO] [stdout] 313 |     const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
[INFO] [stdout]     |           ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:33:5
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub struct DhtNode {
[INFO] [stdout]    |            ------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 33 |     tx: mpsc::Sender<QueryMessage>,
[INFO] [stdout]    |     ^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `DhtNode` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `remove_node`, `mark_failed`, `refresh_stale`, `size`, and `all_nodes` are never used
[INFO] [stdout]    --> crates/core/src/dht/routing_table.rs:115:12
[INFO] [stdout]     |
[INFO] [stdout]  29 | impl RoutingTable {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 115 |     pub fn remove_node(&mut self, node_id: &[u8; 20]) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 126 |     pub fn mark_failed(&mut self, node_id: &[u8; 20]) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 142 |     pub fn refresh_stale(&mut self) -> Vec<[u8; 20]> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 170 |     pub fn size(&self) -> usize {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 174 |     pub fn all_nodes(&self) -> Vec<NodeInfo> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `QUERY_TIMEOUT` is never used
[INFO] [stdout]   --> crates/core/src/dht/query.rs:18:7
[INFO] [stdout]    |
[INFO] [stdout] 18 | const QUERY_TIMEOUT: Duration = Duration::from_secs(5);
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_CONCURRENT_QUERIES` is never used
[INFO] [stdout]   --> crates/core/src/dht/query.rs:19:7
[INFO] [stdout]    |
[INFO] [stdout] 19 | const MAX_CONCURRENT_QUERIES: usize = 8;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> crates/core/src/dht/query.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub enum QueryMessage {
[INFO] [stdout]    |          ------------ variants in this enum
[INFO] [stdout] 23 |     Ping { id: [u8; 20] },
[INFO] [stdout] 24 |     Pong { id: [u8; 20] },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 25 |     FindNode { id: [u8; 20], target: [u8; 20] },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 26 |     FindNodeResponse { id: [u8; 20], nodes: Vec<NodeInfo> },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 27 |     GetPeers { id: [u8; 20], info_hash: [u8; 20] },
[INFO] [stdout] 28 |     GetPeersResponse { id: [u8; 20], token: [u8; 8], peers: Vec<PeerInfo>, nodes: Vec<NodeInfo> },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 29 |     AnnouncePeer { id: [u8; 20], info_hash: [u8; 20], token: [u8; 8], port: u16 },
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 30 |     AnnouncePeerResponse { id: [u8; 20] },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 31 |     Error { id: [u8; 20], message: String },
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `QueryMessage` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `QueryManager` is never constructed
[INFO] [stdout]   --> crates/core/src/dht/query.rs:48:12
[INFO] [stdout]    |
[INFO] [stdout] 48 | pub struct QueryManager {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/dht/query.rs:55:12
[INFO] [stdout]     |
[INFO] [stdout]  54 | impl QueryManager {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout]  55 |     pub fn new(socket: Arc<UdpSocket>, routing_table: Arc<RwLock<RoutingTable>>) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  72 |     pub async fn ping(&self, addr: SocketAddr) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] ...
[INFO] [stdout]  88 |     pub async fn find_node(&self, target: [u8; 20]) -> Result<Vec<NodeInfo>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub async fn get_peers(&self, info_hash: &[u8; 20]) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |     pub async fn announce_peer(&self, info_hash: &[u8; 20], port: u16) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 169 |     async fn query_node(&self, addr: SocketAddr, transaction_id: u32, msg: QueryMessage) -> Result<Vec<NodeInfo>, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 186 |     async fn query_peers(&self, addr: SocketAddr, transaction_id: u32, msg: QueryMessage) -> Result<(Vec<PeerInfo>, Vec<NodeInfo>),...
[INFO] [stdout]     |              ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 200 |     async fn send_query(&self, transaction_id: u32, addr: SocketAddr, msg: QueryMessage) -> Result<(), Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 209 |     async fn create_pending(&self, transaction_id: u32) -> mpsc::Receiver<QueryMessage> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     async fn handle_responses(&self) {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `am_interested` is never read
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:341:5
[INFO] [stdout]     |
[INFO] [stdout] 333 | pub struct PeerConnection {
[INFO] [stdout]     |            -------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 341 |     am_interested: bool,
[INFO] [stdout]     |     ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `PeerConnection` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `write_message` is never used
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:532:14
[INFO] [stdout]     |
[INFO] [stdout] 347 | impl PeerConnection {
[INFO] [stdout]     | ------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 532 |     async fn write_message(&self, msg: PeerMessage) -> Result<(), Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `has_extension` and `set_extension` are never used
[INFO] [stdout]    --> crates/core/src/peer/handshake.rs:94:12
[INFO] [stdout]     |
[INFO] [stdout]  17 | impl Handshake {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  94 |     pub fn has_extension(&self, bit: usize) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 104 |     pub fn set_extension(&mut self, bit: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_MESSAGE_SIZE` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:100:7
[INFO] [stdout]     |
[INFO] [stdout] 100 | const MAX_MESSAGE_SIZE: usize = 16 * 1024 * 1024; // 16MB
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `READ_TIMEOUT` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:101:7
[INFO] [stdout]     |
[INFO] [stdout] 101 | const READ_TIMEOUT: Duration = Duration::from_secs(30);
[INFO] [stdout]     |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `WRITE_TIMEOUT` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:102:7
[INFO] [stdout]     |
[INFO] [stdout] 102 | const WRITE_TIMEOUT: Duration = Duration::from_secs(30);
[INFO] [stdout]     |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PeerWire` is never constructed
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:104:12
[INFO] [stdout]     |
[INFO] [stdout] 104 | pub struct PeerWire {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `read_message`, `write_message`, and `close` are never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:110:12
[INFO] [stdout]     |
[INFO] [stdout] 109 | impl PeerWire {
[INFO] [stdout]     | ------------- associated items in this implementation
[INFO] [stdout] 110 |     pub fn new(stream: TcpStream) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 117 |     pub async fn read_message(&mut self) -> Result<Option<PeerMessage>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub async fn write_message(&mut self, message: &PeerMessage) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 173 |     pub async fn close(&mut self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Block` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:19:12
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub struct Block {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `with_data`, and `is_complete` are never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:27:12
[INFO] [stdout]    |
[INFO] [stdout] 26 | impl Block {
[INFO] [stdout]    | ---------- associated items in this implementation
[INFO] [stdout] 27 |     pub fn new(piece_index: u32, offset: u32, length: u32) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 36 |     pub fn with_data(piece_index: u32, offset: u32, data: Vec<u8>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 46 |     pub fn is_complete(&self) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `PieceState` is never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:53:10
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub enum PieceState {
[INFO] [stdout]    |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PiecesConfig` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:63:12
[INFO] [stdout]    |
[INFO] [stdout] 63 | pub struct PiecesConfig {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PiecesStats` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:83:12
[INFO] [stdout]    |
[INFO] [stdout] 83 | pub struct PiecesStats {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `PieceSelectionStrategy` is never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:95:11
[INFO] [stdout]    |
[INFO] [stdout] 95 | pub trait PieceSelectionStrategy: Send + Sync {
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RarestFirstStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 107 | pub struct RarestFirstStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RandomFirstStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:127:12
[INFO] [stdout]     |
[INFO] [stdout] 127 | pub struct RandomFirstStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SequentialStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:154:12
[INFO] [stdout]     |
[INFO] [stdout] 154 | pub struct SequentialStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `EndgameStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:178:12
[INFO] [stdout]     |
[INFO] [stdout] 178 | pub struct EndgameStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `index` is never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:15:9
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub struct PieceInfo {
[INFO] [stdout]    |            --------- field in this struct
[INFO] [stdout] 15 |     pub index: u32,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PieceInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `total_size` and `uploaded` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:26:5
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub struct PieceManager {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 26 |     total_size: u64,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     uploaded: u64,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `piece_index`, `offset`, and `data` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 36 | struct PieceWrite {
[INFO] [stdout]    |        ---------- fields in this struct
[INFO] [stdout] 37 |     piece_index: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 38 |     offset: u32,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 39 |     data: Vec<u8>,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `peer_interested` and `priority_pieces` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout]  8 | pub struct PiecePicker {
[INFO] [stdout]    |            ----------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 11 |     peer_interested: BitVec,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 12 |     partial_pieces: HashMap<u32, PartialPiece>,
[INFO] [stdout] 13 |     priority_pieces: Vec<u32>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PiecePicker` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `index` and `last_request` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:19:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | struct PartialPiece {
[INFO] [stdout]    |        ------------ fields in this struct
[INFO] [stdout] 19 |     index: u32,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 22 |     last_request: std::time::Instant,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PartialPiece` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `RandomFirst`, `EndGame`, and `Sequential` are never constructed
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:28:5
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub enum SelectionMode {
[INFO] [stdout]    |          ------------- variants in this enum
[INFO] [stdout] 27 |     RarestFirst,
[INFO] [stdout] 28 |     RandomFirst,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 29 |     EndGame,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 30 |     Sequential,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SelectionMode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> crates/core/src/pieces/piece_picker.rs:45:12
[INFO] [stdout]     |
[INFO] [stdout]  33 | impl PiecePicker {
[INFO] [stdout]     | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  45 |     pub fn update_have_pieces(&mut self, bitfield: &BitVec) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  49 |     pub fn update_peer_interested(&mut self, bitfield: &BitVec) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  53 |     pub fn add_partial_piece(&mut self, index: u32, block_count: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  62 |     pub fn mark_block_requested(&mut self, piece_index: u32, block_index: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  69 |     pub fn mark_block_downloaded(&mut self, piece_index: u32, block_index: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  76 |     pub fn piece_completed(&mut self, piece_index: u32) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 145 |     pub fn cancel_stale_requests(&mut self, timeout: std::time::Duration) -> Vec<(u32, usize)> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HashChecker` is never constructed
[INFO] [stdout]  --> crates/core/src/pieces/hash_checker.rs:8:12
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub struct HashChecker;
[INFO] [stdout]   |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `verify_piece`, `verify_pieces`, and `verify_piece_range` are never used
[INFO] [stdout]   --> crates/core/src/pieces/hash_checker.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 10 | impl HashChecker {
[INFO] [stdout]    | ---------------- associated items in this implementation
[INFO] [stdout] 11 |     pub fn new() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 15 |     pub async fn verify_piece(
[INFO] [stdout]    |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     pub async fn verify_pieces(
[INFO] [stdout]    |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 55 |     pub async fn verify_piece_range(
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DiskWriter` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/disk_writer.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct DiskWriter {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `WriteOperation` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/disk_writer.rs:17:8
[INFO] [stdout]    |
[INFO] [stdout] 17 | struct WriteOperation {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `write`, `write_batch`, `flush`, and `close` are never used
[INFO] [stdout]    --> crates/core/src/storage/disk_writer.rs:24:18
[INFO] [stdout]     |
[INFO] [stdout]  23 | impl DiskWriter {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout]  24 |     pub async fn new(file_path: PathBuf) -> Result<Self, Error> {
[INFO] [stdout]     |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 106 |     pub async fn write(&self, offset: u64, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     pub async fn write_batch(&self, writes: Vec<(u64, Vec<u8>)>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub async fn flush(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub async fn close(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MemoryCache` is never constructed
[INFO] [stdout]  --> crates/core/src/storage/memory_cache.rs:8:12
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub struct MemoryCache {
[INFO] [stdout]   |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CacheKey` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:15:8
[INFO] [stdout]    |
[INFO] [stdout] 15 | struct CacheKey {
[INFO] [stdout]    |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CacheEntry` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:21:8
[INFO] [stdout]    |
[INFO] [stdout] 21 | struct CacheEntry {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `get`, `put`, `get_piece_blocks`, `clear`, and `size` are never used
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:27:12
[INFO] [stdout]    |
[INFO] [stdout] 26 | impl MemoryCache {
[INFO] [stdout]    | ---------------- associated items in this implementation
[INFO] [stdout] 27 |     pub fn new(max_size_mb: usize) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 39 |     pub async fn get(&self, piece_index: u32, block_offset: u32) -> Option<Vec<u8>> {
[INFO] [stdout]    |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 50 |     pub async fn put(&self, piece_index: u32, block_offset: u32, data: Vec<u8>) {
[INFO] [stdout]    |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 72 |     pub async fn get_piece_blocks(&self, piece_index: u32) -> Vec<(u32, Vec<u8>)> {
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 85 |     pub async fn clear(&self) {
[INFO] [stdout]    |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 91 |     pub async fn size(&self) -> usize {
[INFO] [stdout]    |                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FileManager` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct FileManager {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/storage/file_manager.rs:19:12
[INFO] [stdout]     |
[INFO] [stdout]  18 | impl FileManager {
[INFO] [stdout]     | ---------------- associated items in this implementation
[INFO] [stdout]  19 |     pub fn new(base_path: PathBuf, files: Vec<TorrentFile>) -> Result<Self, Error> {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  40 |     pub async fn write(&self, offset: u64, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  49 |     pub async fn write_piece(&self, piece_index: u32, piece_length: u32, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  76 |     pub async fn read(&self, offset: u64, length: u64) -> Result<Vec<u8>, Error> {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 102 |     pub async fn flush_all(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 110 |     pub async fn close_all(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     async fn get_writer(&self, file_path: &Path) -> Result<Arc<DiskWriter>, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 135 |     fn resolve_offset(&self, offset: u64) -> Result<(PathBuf, u64), Error> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub fn total_size(&self) -> u64 {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `downloaded_bytes`, `uploaded_bytes`, `download_rate`, and `upload_rate` are never read
[INFO] [stdout]   --> crates/core/src/downloader.rs:30:5
[INFO] [stdout]    |
[INFO] [stdout] 29 | struct DownloadStats {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 30 |     downloaded_bytes: u64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 31 |     uploaded_bytes: u64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 32 |     download_rate: f64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 33 |     upload_rate: f64,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `peer`, `block_offset`, and `block_length` are never read
[INFO] [stdout]   --> crates/core/src/uploader.rs:63:5
[INFO] [stdout]    |
[INFO] [stdout] 62 | struct UploadRequest {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 63 |     peer: Arc<PeerConnection>,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 64 |     piece_index: u32,
[INFO] [stdout] 65 |     block_offset: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 66 |     block_length: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `UploadRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `config` is never read
[INFO] [stdout]   --> crates/core/src/seeding.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub struct Seeder {
[INFO] [stdout]    |            ------ field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 13 |     config: Arc<Config>,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NatTraversal` is never constructed
[INFO] [stdout]  --> crates/core/src/nat_traversal.rs:7:12
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub struct NatTraversal;
[INFO] [stdout]   |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/nat_traversal.rs:10:12
[INFO] [stdout]     |
[INFO] [stdout]   9 | impl NatTraversal {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout]  10 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  14 |     pub async fn get_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  33 |     async fn get_upnp_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  53 |     async fn get_stun_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  58 |     async fn get_http_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  71 |     pub async fn add_port_mapping(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     pub async fn remove_port_mapping(&self, external_port: u16, protocol: Protocol) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Protocol` is never used
[INFO] [stdout]    --> crates/core/src/nat_traversal.rs:137:10
[INFO] [stdout]     |
[INFO] [stdout] 137 | pub enum Protocol {
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PeerDiscovery` is never constructed
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct PeerDiscovery {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `DiscoveryMethod` is never used
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:16:6
[INFO] [stdout]    |
[INFO] [stdout] 16 | enum DiscoveryMethod {
[INFO] [stdout]    |      ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:24:12
[INFO] [stdout]    |
[INFO] [stdout] 23 | impl PeerDiscovery {
[INFO] [stdout]    | ------------------ associated items in this implementation
[INFO] [stdout] 24 |     pub fn new() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     pub async fn discover_peers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 62 |     async fn discover_via_dht(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 67 |     async fn discover_via_trackers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 72 |     async fn discover_via_lsd(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 77 |     pub async fn add_peer(&self, addr: SocketAddr) {
[INFO] [stdout]    |                  ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 81 |     pub async fn remove_peer(&self, addr: &SocketAddr) {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 85 |     pub async fn known_peers(&self) -> Vec<SocketAddr> {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 89 |     pub async fn clear_stale(&self, max_age: std::time::Duration) {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `active_connections` is never read
[INFO] [stdout]   --> crates/core/src/node_manager.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | struct NodeStats {
[INFO] [stdout]    |        --------- field in this struct
[INFO] [stdout] 23 |     total_peers_discovered: u64,
[INFO] [stdout] 24 |     active_connections: usize,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `NodeStats` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:39:9
[INFO] [stdout]    |
[INFO] [stdout] 39 |         self.uploader.start().await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout]    = note: `#[warn(unused_must_use)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 39 |         let _ = self.uploader.start().await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:56:9
[INFO] [stdout]    |
[INFO] [stdout] 56 |         self.uploader.stop().await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 56 |         let _ = self.uploader.stop().await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:62:9
[INFO] [stdout]    |
[INFO] [stdout] 62 |         self.uploader.add_peer(peer).await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 62 |         let _ = self.uploader.add_peer(peer).await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:66:9
[INFO] [stdout]    |
[INFO] [stdout] 66 |         self.uploader.remove_peer(peer).await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 66 |         let _ = self.uploader.remove_peer(peer).await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling paste v1.0.15
[INFO] [stderr]    Compiling colorchoice v1.0.4
[INFO] [stderr]    Compiling anstyle v1.0.13
[INFO] [stderr]    Compiling unicode-width v0.2.2
[INFO] [stderr]    Compiling portable-atomic v1.13.1
[INFO] [stderr]    Compiling heck v0.4.1
[INFO] [stderr]    Compiling linux-raw-sys v0.12.1
[INFO] [stderr]    Compiling strum_macros v0.25.3
[INFO] [stderr]    Compiling anstream v0.6.21
[INFO] [stderr]    Compiling console v0.15.11
[INFO] [stderr]    Compiling jsonwebtoken v9.3.1
[INFO] [stderr]    Compiling neli-proc-macros v0.2.2
[INFO] [stderr]    Compiling signal-hook-mio v0.2.5
[INFO] [stderr]    Compiling argon2 v0.5.3
[INFO] [stderr]    Compiling tower-http v0.5.2
[INFO] [stderr]    Compiling getset v0.1.6
[INFO] [stderr]    Compiling derive_builder v0.20.2
[INFO] [stderr]    Compiling tower v0.4.13
[INFO] [stderr]    Compiling clap_lex v1.0.0
[INFO] [stderr]    Compiling clap_derive v4.5.55
[INFO] [stderr]    Compiling clap_builder v4.5.60
[INFO] [stderr]    Compiling neli v0.7.4
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling crossterm v0.27.0
[INFO] [stderr]    Compiling strum v0.25.0
[INFO] [stderr]    Compiling axum-extra v0.9.6
[INFO] [stderr]    Compiling itertools v0.11.0
[INFO] [stderr]    Compiling unicode-segmentation v1.12.0
[INFO] [stderr]    Compiling indoc v2.0.7
[INFO] [stderr]    Compiling number_prefix v0.4.0
[INFO] [stderr]    Compiling cassowary v0.3.0
[INFO] [stderr]    Compiling zeroize v1.8.2
[INFO] [stderr]    Compiling api v0.1.0 (/opt/rustwide/workdir/crates/api)
[INFO] [stdout] warning: unused imports: `IntoResponse` and `body::Body`
[INFO] [stdout]  --> crates/api/src/routes/files.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 |     body::Body,
[INFO] [stdout]   |     ^^^^^^^^^^
[INFO] [stdout] 6 |     response::{Response, IntoResponse},
[INFO] [stdout]   |                          ^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated function `base64::decode`: Use Engine::decode
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:71:32
[INFO] [stdout]    |
[INFO] [stdout] 71 |     let torrent_data = base64::decode(&req.torrent_file)
[INFO] [stdout]    |                                ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling shell-words v1.1.1
[INFO] [stderr]    Compiling indicatif v0.17.11
[INFO] [stderr]    Compiling dialoguer v0.11.0
[INFO] [stderr]    Compiling sysinfo v0.30.13
[INFO] [stdout] warning: unused variable: `path`
[INFO] [stdout]   --> crates/api/src/routes/files.rs:42:10
[INFO] [stdout]    |
[INFO] [stdout] 42 |     Path(path): Path<String>,
[INFO] [stdout]    |          ^^^^ help: if this is intentional, prefix it with an underscore: `_path`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `state`
[INFO] [stdout]   --> crates/api/src/websocket.rs:23:43
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stdout]    |                                           ^^^^^ help: if this is intentional, prefix it with an underscore: `_state`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `tx`
[INFO] [stdout]   --> crates/api/src/websocket.rs:27:10
[INFO] [stdout]    |
[INFO] [stdout] 27 |     let (tx, mut rx) = broadcast::channel(32);
[INFO] [stdout]    |          ^^ help: if this is intentional, prefix it with an underscore: `_tx`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling ratatui v0.24.0
[INFO] [stderr]    Compiling clap v4.5.60
[INFO] [stderr]    Compiling local-ip-address v0.6.10
[INFO] [stderr]    Compiling signal-hook-tokio v0.3.1
[INFO] [stderr]    Compiling tokio-stream v0.1.18
[INFO] [stderr]    Compiling colored v2.2.0
[INFO] [stderr]    Compiling dns-lookup v2.1.1
[INFO] [stderr]    Compiling nix v0.27.1
[INFO] [stderr]    Compiling cli v0.1.0 (/opt/rustwide/workdir/crates/cli)
[INFO] [stdout] warning: unused import: `std::path::Path`
[INFO] [stdout]  --> crates/cli/src/commands.rs:7:5
[INFO] [stdout]   |
[INFO] [stdout] 7 | use std::path::Path;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Gauge`
[INFO] [stdout]   --> crates/cli/src/ui.rs:12:60
[INFO] [stdout]    |
[INFO] [stdout] 12 |     widgets::{Block, Borders, Cell, Row, Table, Paragraph, Gauge},
[INFO] [stdout]    |                                                            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tracing::info`
[INFO] [stdout]  --> crates/cli/src/main.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use tracing::info;
[INFO] [stdout]   |     ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated function `base64::encode`: Use Engine::encode
[INFO] [stdout]   --> crates/cli/src/commands.rs:18:27
[INFO] [stdout]    |
[INFO] [stdout] 18 |     let encoded = base64::encode(&data);
[INFO] [stdout]    |                           ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Backend`
[INFO] [stdout]   --> crates/cli/src/ui.rs:10:15
[INFO] [stdout]    |
[INFO] [stdout] 10 |     backend::{Backend, CrosstermBackend},
[INFO] [stdout]    |               ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TuiApp` is never constructed
[INFO] [stdout]   --> crates/cli/src/ui.rs:21:12
[INFO] [stdout]    |
[INFO] [stdout] 21 | pub struct TuiApp {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TorrentInfo` is never constructed
[INFO] [stdout]   --> crates/cli/src/ui.rs:27:8
[INFO] [stdout]    |
[INFO] [stdout] 27 | struct TorrentInfo {
[INFO] [stdout]    |        ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `run`, `draw`, `draw_torrents`, `handle_events`, and `update_torrents` are never used
[INFO] [stdout]    --> crates/cli/src/ui.rs:36:12
[INFO] [stdout]     |
[INFO] [stdout]  35 | impl TuiApp {
[INFO] [stdout]     | ----------- associated items in this implementation
[INFO] [stdout]  36 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  45 |     pub async fn run(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stdout]     |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout]  80 |     fn draw(&mut self, f: &mut Frame<'_>) {
[INFO] [stdout]     |        ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     fn draw_torrents(&self, f: &mut Frame<'_>, area: Rect) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 151 |     fn handle_events(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 169 |     async fn update_torrents(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TorrentData` is never constructed
[INFO] [stdout]    --> crates/cli/src/ui.rs:188:8
[INFO] [stdout]     |
[INFO] [stdout] 188 | struct TorrentData {
[INFO] [stdout]     |        ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling node v0.1.0 (/opt/rustwide/workdir/crates/node)
[INFO] [stdout] warning: unused imports: `IntoResponse` and `body::Body`
[INFO] [stdout]  --> crates/api/src/routes/files.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 |     body::Body,
[INFO] [stdout]   |     ^^^^^^^^^^
[INFO] [stdout] 6 |     response::{Response, IntoResponse},
[INFO] [stdout]   |                          ^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Router`, `delete`, `get`, `http::Method`, and `post`
[INFO] [stdout]   --> crates/api/src/main.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout] 11 |     Router,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 12 |     routing::{get, post, delete},
[INFO] [stdout]    |               ^^^  ^^^^  ^^^^^^
[INFO] [stdout] 13 |     http::Method,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Any` and `CorsLayer`
[INFO] [stdout]   --> crates/api/src/main.rs:15:24
[INFO] [stdout]    |
[INFO] [stdout] 15 | use tower_http::cors::{CorsLayer, Any};
[INFO] [stdout]    |                        ^^^^^^^^^  ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::future`
[INFO] [stdout]   --> crates/api/src/main.rs:17:5
[INFO] [stdout]    |
[INFO] [stdout] 17 | use std::future;
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tokio::sync::broadcast`
[INFO] [stdout]   --> crates/api/src/main.rs:18:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | use tokio::sync::broadcast;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated function `base64::decode`: Use Engine::decode
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:71:32
[INFO] [stdout]    |
[INFO] [stdout] 71 |     let torrent_data = base64::decode(&req.torrent_file)
[INFO] [stdout]    |                                ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `path`
[INFO] [stdout]   --> crates/api/src/routes/files.rs:42:10
[INFO] [stdout]    |
[INFO] [stdout] 42 |     Path(path): Path<String>,
[INFO] [stdout]    |          ^^^^ help: if this is intentional, prefix it with an underscore: `_path`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `state`
[INFO] [stdout]   --> crates/api/src/websocket.rs:23:43
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stdout]    |                                           ^^^^^ help: if this is intentional, prefix it with an underscore: `_state`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `tx`
[INFO] [stdout]   --> crates/api/src/websocket.rs:27:10
[INFO] [stdout]    |
[INFO] [stdout] 27 |     let (tx, mut rx) = broadcast::channel(32);
[INFO] [stdout]    |          ^^ help: if this is intentional, prefix it with an underscore: `_tx`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `shutdown_signal` is never used
[INFO] [stdout]   --> crates/api/src/main.rs:56:10
[INFO] [stdout]    |
[INFO] [stdout] 56 | async fn shutdown_signal() {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AddTorrentRequest` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:13:12
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub struct AddTorrentRequest {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AddMagnetRequest` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:18:12
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub struct AddMagnetRequest {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RemoveTorrentRequest` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:23:12
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub struct RemoveTorrentRequest {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TorrentResponse` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:28:12
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub struct TorrentResponse {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_torrents` is never used
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:43:14
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub async fn list_torrents(
[INFO] [stdout]    |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `add_torrent` is never used
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:66:14
[INFO] [stdout]    |
[INFO] [stdout] 66 | pub async fn add_torrent(
[INFO] [stdout]    |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `add_magnet` is never used
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:98:14
[INFO] [stdout]    |
[INFO] [stdout] 98 | pub async fn add_magnet(
[INFO] [stdout]    |              ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_torrent` is never used
[INFO] [stdout]    --> crates/api/src/routes/torrents.rs:125:14
[INFO] [stdout]     |
[INFO] [stdout] 125 | pub async fn get_torrent(
[INFO] [stdout]     |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_torrent` is never used
[INFO] [stdout]    --> crates/api/src/routes/torrents.rs:149:14
[INFO] [stdout]     |
[INFO] [stdout] 149 | pub async fn remove_torrent(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `pause_torrent` is never used
[INFO] [stdout]    --> crates/api/src/routes/torrents.rs:160:14
[INFO] [stdout]     |
[INFO] [stdout] 160 | pub async fn pause_torrent(
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resume_torrent` is never used
[INFO] [stdout]    --> crates/api/src/routes/torrents.rs:170:14
[INFO] [stdout]     |
[INFO] [stdout] 170 | pub async fn resume_torrent(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `StatsResponse` is never constructed
[INFO] [stdout]  --> crates/api/src/routes/stats.rs:9:12
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub struct StatsResponse {
[INFO] [stdout]   |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_stats` is never used
[INFO] [stdout]   --> crates/api/src/routes/stats.rs:19:14
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub async fn get_stats(
[INFO] [stdout]    |              ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_files` is never used
[INFO] [stdout]   --> crates/api/src/routes/files.rs:13:14
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub async fn list_files(
[INFO] [stdout]    |              ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_file` is never used
[INFO] [stdout]   --> crates/api/src/routes/files.rs:41:14
[INFO] [stdout]    |
[INFO] [stdout] 41 | pub async fn get_file(
[INFO] [stdout]    |              ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FileInfo` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/files.rs:50:12
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub struct FileInfo {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `websocket_handler` is never used
[INFO] [stdout]   --> crates/api/src/websocket.rs:16:14
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub async fn websocket_handler(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `handle_socket` is never used
[INFO] [stdout]   --> crates/api/src/websocket.rs:23:10
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `logging_middleware` is never used
[INFO] [stdout]   --> crates/api/src/middleware.rs:14:14
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub async fn logging_middleware(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `auth_middleware` is never used
[INFO] [stdout]   --> crates/api/src/middleware.rs:30:14
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub async fn auth_middleware(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_token` is never used
[INFO] [stdout]   --> crates/api/src/middleware.rs:59:4
[INFO] [stdout]    |
[INFO] [stdout] 59 | fn validate_token(_token: &str, _secret: &str) -> bool {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cors_middleware` is never used
[INFO] [stdout]   --> crates/api/src/middleware.rs:64:14
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub async fn cors_middleware(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AppState` is never constructed
[INFO] [stdout]  --> crates/api/src/state.rs:8:12
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub struct AppState {
[INFO] [stdout]   |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 19s
[INFO] [stderr] warning: the following packages contain code that will be rejected by a future version of Rust: proc-macro-error2 v2.0.1
[INFO] [stderr] note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
[INFO] running `Command { std: "docker" "inspect" "5995a6b33fcb059d7e44b159c0abec76e080089fd6d2f609b3729d3a22906a6e", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "5995a6b33fcb059d7e44b159c0abec76e080089fd6d2f609b3729d3a22906a6e", kill_on_drop: false }`
[INFO] [stdout] 5995a6b33fcb059d7e44b159c0abec76e080089fd6d2f609b3729d3a22906a6e
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 68c3d0501d1cede412b1a2323cd273c4d3d3029c4b66d8ede7c846aeed451ae5
[INFO] running `Command { std: "docker" "start" "-a" "68c3d0501d1cede412b1a2323cd273c4d3d3029c4b66d8ede7c846aeed451ae5", kill_on_drop: false }`
[INFO] [stderr]    Compiling futures-io v0.3.32
[INFO] [stderr]    Compiling aho-corasick v1.1.4
[INFO] [stderr]    Compiling regex-syntax v0.8.10
[INFO] [stderr]    Compiling url v2.5.8
[INFO] [stderr]    Compiling getrandom v0.1.16
[INFO] [stderr]    Compiling concurrent-queue v2.5.0
[INFO] [stderr]    Compiling fastrand v1.9.0
[INFO] [stderr]    Compiling event-listener v2.5.3
[INFO] [stderr]    Compiling futures-util v0.3.32
[INFO] [stderr]    Compiling rand_core v0.5.1
[INFO] [stderr]    Compiling http-types v2.12.0
[INFO] [stderr]    Compiling parking v2.2.1
[INFO] [stderr]    Compiling waker-fn v1.2.0
[INFO] [stderr]    Compiling rand_chacha v0.2.2
[INFO] [stderr]    Compiling async-channel v1.9.0
[INFO] [stderr]    Compiling futures-lite v1.13.0
[INFO] [stderr]    Compiling rand v0.7.3
[INFO] [stderr]    Compiling serde_qs v0.8.5
[INFO] [stderr]    Compiling attohttpc v0.24.1
[INFO] [stderr]    Compiling infer v0.2.3
[INFO] [stderr]    Compiling igd-next v0.14.3
[INFO] [stderr]    Compiling retain_mut v0.1.9
[INFO] [stderr]    Compiling deadpool-runtime v0.1.4
[INFO] [stderr]    Compiling deadpool v0.9.5
[INFO] [stderr]    Compiling assert-json-diff v2.0.2
[INFO] [stderr]    Compiling predicates-core v1.0.10
[INFO] [stderr]    Compiling futures-timer v3.0.3
[INFO] [stderr]    Compiling assert_cmd v2.2.0
[INFO] [stderr]    Compiling termtree v0.5.1
[INFO] [stderr]    Compiling difflib v0.4.0
[INFO] [stderr]    Compiling predicates-tree v1.0.13
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling predicates v3.1.4
[INFO] [stderr]    Compiling wait-timeout v0.2.1
[INFO] [stderr]    Compiling h2 v0.3.27
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling axum-core v0.4.5
[INFO] [stderr]    Compiling tower v0.5.3
[INFO] [stderr]    Compiling tokio-tungstenite v0.24.0
[INFO] [stderr]    Compiling futures v0.3.32
[INFO] [stderr]    Compiling hyper-util v0.1.20
[INFO] [stderr]    Compiling multer v3.1.0
[INFO] [stderr]    Compiling matchers v0.2.0
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling bstr v1.12.1
[INFO] [stderr]    Compiling tracing-subscriber v0.3.22
[INFO] [stderr]    Compiling axum v0.7.9
[INFO] [stderr]    Compiling common v0.1.0 (/opt/rustwide/workdir/crates/common)
[INFO] [stderr]    Compiling hyper v0.14.32
[INFO] [stderr]    Compiling axum-extra v0.9.6
[INFO] [stderr]    Compiling hyper-tls v0.5.0
[INFO] [stderr]    Compiling wiremock v0.5.22
[INFO] [stderr]    Compiling reqwest v0.11.27
[INFO] [stderr]    Compiling core v0.1.0 (/opt/rustwide/workdir/crates/core)
[INFO] [stdout] warning: unused import: `std::path::PathBuf`
[INFO] [stdout]  --> crates/core/src/torrent.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use std::path::PathBuf;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Decoder` and `Value`
[INFO] [stdout]  --> crates/core/src/tracker.rs:4:22
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::bencode::{Decoder, Value};
[INFO] [stdout]   |                      ^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `BTreeMap`
[INFO] [stdout]  --> crates/core/src/dht/routing_table.rs:3:24
[INFO] [stdout]   |
[INFO] [stdout] 3 | use std::collections::{BTreeMap, VecDeque};
[INFO] [stdout]   |                        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]   --> crates/core/src/dht/query.rs:13:15
[INFO] [stdout]    |
[INFO] [stdout] 13 | use tracing::{debug, warn};
[INFO] [stdout]    |               ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `QueryManager`
[INFO] [stdout]  --> crates/core/src/dht/mod.rs:9:17
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use query::{QueryManager, QueryMessage};
[INFO] [stdout]   |                 ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Sha1`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:22:12
[INFO] [stdout]    |
[INFO] [stdout] 22 | use sha1::{Sha1, Digest};
[INFO] [stdout]    |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `BufMut`
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:325:23
[INFO] [stdout]     |
[INFO] [stdout] 325 | use bytes::{BytesMut, BufMut};
[INFO] [stdout]     |                       ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `BufMut` and `BytesMut`
[INFO] [stdout]  --> crates/core/src/peer/message.rs:3:13
[INFO] [stdout]   |
[INFO] [stdout] 3 | use bytes::{BytesMut, BufMut};
[INFO] [stdout]   |             ^^^^^^^^  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PeerMessageId`
[INFO] [stdout]   --> crates/core/src/peer/peer_wire.rs:93:35
[INFO] [stdout]    |
[INFO] [stdout] 93 | use super::message::{PeerMessage, PeerMessageId};
[INFO] [stdout]    |                                   ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `handshake::Handshake`
[INFO] [stdout]  --> crates/core/src/peer/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use handshake::Handshake;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `PeerMessageId` and `PeerMessage`
[INFO] [stdout]   --> crates/core/src/peer/mod.rs:10:19
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use message::{PeerMessage, PeerMessageId};
[INFO] [stdout]    |                   ^^^^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Path`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:6:17
[INFO] [stdout]   |
[INFO] [stdout] 6 | use std::path::{Path, PathBuf};
[INFO] [stdout]   |                 ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `RwLock`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:8:26
[INFO] [stdout]   |
[INFO] [stdout] 8 | use tokio::sync::{Mutex, RwLock};
[INFO] [stdout]   |                          ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:9:21
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::{info, debug};
[INFO] [stdout]   |                     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `VecDeque`
[INFO] [stdout]  --> crates/core/src/pieces/piece_picker.rs:4:33
[INFO] [stdout]   |
[INFO] [stdout] 4 | use std::collections::{HashMap, VecDeque};
[INFO] [stdout]   |                                 ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::sync::Arc`
[INFO] [stdout]  --> crates/core/src/pieces/hash_checker.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use std::sync::Arc;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PieceInfo`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:7:39
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub use piece_manager::{PieceManager, PieceInfo};
[INFO] [stdout]   |                                       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `SelectionMode`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:8:37
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub use piece_picker::{PiecePicker, SelectionMode};
[INFO] [stdout]   |                                     ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `hash_checker::HashChecker`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use hash_checker::HashChecker;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::error::Error`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | use crate::error::Error;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `common::types::TorrentFile`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:12:5
[INFO] [stdout]    |
[INFO] [stdout] 12 | use common::types::TorrentFile;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::path::PathBuf`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 13 | use std::path::PathBuf;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::sync::Arc`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:14:5
[INFO] [stdout]    |
[INFO] [stdout] 14 | use std::sync::Arc;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tokio::sync::Mutex`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:15:5
[INFO] [stdout]    |
[INFO] [stdout] 15 | use tokio::sync::Mutex;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Path`
[INFO] [stdout]  --> crates/core/src/storage/disk_writer.rs:4:17
[INFO] [stdout]   |
[INFO] [stdout] 4 | use std::path::{Path, PathBuf};
[INFO] [stdout]   |                 ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]  --> crates/core/src/storage/disk_writer.rs:9:15
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::{debug, error};
[INFO] [stdout]   |               ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Mutex`
[INFO] [stdout]  --> crates/core/src/storage/file_manager.rs:9:19
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tokio::sync::{Mutex, RwLock};
[INFO] [stdout]   |                   ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `disk_writer::DiskWriter`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:7:9
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub use disk_writer::DiskWriter;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `memory_cache::MemoryCache`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:8:9
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub use memory_cache::MemoryCache;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `file_manager::FileManager`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use file_manager::FileManager;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PieceManager`
[INFO] [stdout]  --> crates/core/src/downloader.rs:5:21
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::pieces::{PieceManager, PiecePicker};
[INFO] [stdout]   |                     ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `TorrentState`
[INFO] [stdout]  --> crates/core/src/downloader.rs:8:31
[INFO] [stdout]   |
[INFO] [stdout] 8 | use common::types::{PeerInfo, TorrentState};
[INFO] [stdout]   |                               ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `mpsc`
[INFO] [stdout]   --> crates/core/src/downloader.rs:12:34
[INFO] [stdout]    |
[INFO] [stdout] 12 | use tokio::sync::{Mutex, RwLock, mpsc};
[INFO] [stdout]    |                                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::pieces::PieceManager`
[INFO] [stdout]  --> crates/core/src/uploader.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::pieces::PieceManager;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tokio::time`
[INFO] [stdout]  --> crates/core/src/uploader.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tokio::time;
[INFO] [stdout]   |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `info`
[INFO] [stdout]   --> crates/core/src/uploader.rs:10:22
[INFO] [stdout]    |
[INFO] [stdout] 10 | use tracing::{debug, info};
[INFO] [stdout]    |                      ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tracing::debug`
[INFO] [stdout]  --> crates/core/src/peer_discovery.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::debug;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `debug` and `info`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:11:15
[INFO] [stdout]    |
[INFO] [stdout] 11 | use tracing::{info, debug};
[INFO] [stdout]    |               ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:42:18
[INFO] [stdout]    |
[INFO] [stdout] 42 |         let (tx, mut rx) = mpsc::channel(1000);
[INFO] [stdout]    |                  ----^^
[INFO] [stdout]    |                  |
[INFO] [stdout]    |                  help: remove this `mut`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:414:17
[INFO] [stdout]     |
[INFO] [stdout] 414 |             let mut buf = BytesMut::with_capacity(4096);
[INFO] [stdout]     |                 ----^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:181:13
[INFO] [stdout]     |
[INFO] [stdout] 181 |         let mut piece_data = Vec::with_capacity(self.piece_length as usize);
[INFO] [stdout]     |             ----^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:220:13
[INFO] [stdout]     |
[INFO] [stdout] 220 |         let mut offset_in_piece = 0;
[INFO] [stdout]     |             ----^^^^^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/lib.rs:440:13
[INFO] [stdout]     |
[INFO] [stdout] 440 |         for mut entry in self.torrents.iter_mut() {
[INFO] [stdout]     |             ----^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Digest`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:22:18
[INFO] [stdout]    |
[INFO] [stdout] 22 | use sha1::{Sha1, Digest};
[INFO] [stdout]    |                  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `addr`
[INFO] [stdout]    --> crates/core/src/dht/query.rs:220:26
[INFO] [stdout]     |
[INFO] [stdout] 220 |                 Ok((len, addr)) => {
[INFO] [stdout]     |                          ^^^^ help: if this is intentional, prefix it with an underscore: `_addr`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `msg`
[INFO] [stdout]    --> crates/core/src/dht/query.rs:200:71
[INFO] [stdout]     |
[INFO] [stdout] 200 |     async fn send_query(&self, transaction_id: u32, addr: SocketAddr, msg: QueryMessage) -> Result<(), Error> {
[INFO] [stdout]     |                                                                       ^^^ help: if this is intentional, prefix it with an underscore: `_msg`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `config`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:37:22
[INFO] [stdout]    |
[INFO] [stdout] 37 |     pub async fn new(config: &Config) -> Result<Self, Error> {
[INFO] [stdout]    |                      ^^^^^^ help: if this is intentional, prefix it with an underscore: `_config`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `port`
[INFO] [stdout]    --> crates/core/src/dht/mod.rs:114:61
[INFO] [stdout]     |
[INFO] [stdout] 114 |                 QueryMessage::AnnouncePeer { id, info_hash, port, .. } => {
[INFO] [stdout]     |                                                             ^^^^ help: try ignoring the field: `port: _`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `buf`
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:414:17
[INFO] [stdout]     |
[INFO] [stdout] 414 |             let mut buf = BytesMut::with_capacity(4096);
[INFO] [stdout]     |                 ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_buf`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `block_count`
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |         let block_count = (self.pieces[piece_index as usize].length as f64 / block_size as f64).ceil() as usize;
[INFO] [stdout]     |             ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_count`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `offset_in_piece`
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:220:13
[INFO] [stdout]     |
[INFO] [stdout] 220 |         let mut offset_in_piece = 0;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_offset_in_piece`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:91:13
[INFO] [stdout]    |
[INFO] [stdout] 91 |         let mut piece_rarity = vec![0; self.piece_count];
[INFO] [stdout]    |             ----^^^^^^^^^^^^
[INFO] [stdout]    |             |
[INFO] [stdout]    |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `piece_rarity`
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:91:13
[INFO] [stdout]    |
[INFO] [stdout] 91 |         let mut piece_rarity = vec![0; self.piece_count];
[INFO] [stdout]    |             ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_piece_rarity`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `piece_index`
[INFO] [stdout]   --> crates/core/src/pieces/hash_checker.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 58 |         piece_index: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_piece_index`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:113:9
[INFO] [stdout]     |
[INFO] [stdout] 113 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:114:9
[INFO] [stdout]     |
[INFO] [stdout] 114 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:133:9
[INFO] [stdout]     |
[INFO] [stdout] 133 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:134:9
[INFO] [stdout]     |
[INFO] [stdout] 134 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:160:9
[INFO] [stdout]     |
[INFO] [stdout] 160 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:161:9
[INFO] [stdout]     |
[INFO] [stdout] 161 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:184:9
[INFO] [stdout]     |
[INFO] [stdout] 184 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `old_key`
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:63:26
[INFO] [stdout]    |
[INFO] [stdout] 63 |             if let Some((old_key, old_entry)) = cache.pop_lru() {
[INFO] [stdout]    |                          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_old_key`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_start`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:59:21
[INFO] [stdout]    |
[INFO] [stdout] 59 |             let (_, file_start, file_end) = self.file_offsets.iter()
[INFO] [stdout]    |                     ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_start`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_offset`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:82:29
[INFO] [stdout]    |
[INFO] [stdout] 82 |             let (file_path, file_offset) = self.resolve_offset(current_pos)?;
[INFO] [stdout]    |                             ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_offset`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `writer`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:83:17
[INFO] [stdout]    |
[INFO] [stdout] 83 |             let writer = self.get_writer(&file_path).await?;
[INFO] [stdout]    |                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_writer`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_start`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:85:21
[INFO] [stdout]    |
[INFO] [stdout] 85 |             let (_, file_start, file_end) = self.file_offsets.iter()
[INFO] [stdout]    |                     ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_start`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peer`
[INFO] [stdout]    --> crates/core/src/downloader.rs:285:13
[INFO] [stdout]     |
[INFO] [stdout] 285 |         for peer in peers.iter() {
[INFO] [stdout]     |             ^^^^ help: if this is intentional, prefix it with an underscore: `_peer`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `stream`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:57:25
[INFO] [stdout]    |
[INFO] [stdout] 57 |                     Ok((stream, addr)) => {
[INFO] [stdout]    |                         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_stream`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `mgr`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:53:13
[INFO] [stdout]    |
[INFO] [stdout] 53 |         let mgr = self.clone();
[INFO] [stdout]    |             ^^^ help: if this is intentional, prefix it with an underscore: `_mgr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `connection`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:71:43
[INFO] [stdout]    |
[INFO] [stdout] 71 |     async fn handle_new_connection(&self, connection: PeerConnection) {
[INFO] [stdout]    |                                           ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_connection`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:62:38
[INFO] [stdout]    |
[INFO] [stdout] 62 |     async fn discover_via_dht(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:67:43
[INFO] [stdout]    |
[INFO] [stdout] 67 |     async fn discover_via_trackers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                           ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:72:38
[INFO] [stdout]    |
[INFO] [stdout] 72 |     async fn discover_via_lsd(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `max_age`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:89:37
[INFO] [stdout]    |
[INFO] [stdout] 89 |     pub async fn clear_stale(&self, max_age: std::time::Duration) {
[INFO] [stdout]    |                                     ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_max_age`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `torrents`
[INFO] [stdout]    --> crates/core/src/lib.rs:105:42
[INFO] [stdout]     |
[INFO] [stdout] 105 |     async fn load_state(config: &Config, torrents: &DashMap<String, TorrentHandle>) -> Result<()> {
[INFO] [stdout]     |                                          ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_torrents`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `download_path`
[INFO] [stdout]    --> crates/core/src/lib.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |         let download_path = self.config.paths.download_path.join(&name);
[INFO] [stdout]     |             ^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_download_path`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `NodeStats` is more private than the item `NodeManager::stats`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:88:5
[INFO] [stdout]    |
[INFO] [stdout] 88 |     pub async fn stats(&self) -> NodeStats {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `NodeManager::stats` is reachable at visibility `pub`
[INFO] [stdout]    |
[INFO] [stdout] note: but type `NodeStats` is only usable at visibility `pub(self)`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:22:1
[INFO] [stdout]    |
[INFO] [stdout] 22 | struct NodeStats {
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^
[INFO] [stdout]    = note: `#[warn(private_interfaces)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `stats` is never read
[INFO] [stdout]   --> crates/core/src/lib.rs:43:5
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub struct BitTorrentClient {
[INFO] [stdout]    |            ---------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 43 |     stats: Arc<RwLock<ClientStats>>,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `BitTorrentClient` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ALPHABET` is never used
[INFO] [stdout]    --> crates/core/src/torrent.rs:309:11
[INFO] [stdout]     |
[INFO] [stdout] 309 |     const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
[INFO] [stdout]     |           ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ALPHABET` is never used
[INFO] [stdout]    --> crates/core/src/torrent.rs:313:11
[INFO] [stdout]     |
[INFO] [stdout] 313 |     const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
[INFO] [stdout]     |           ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:33:5
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub struct DhtNode {
[INFO] [stdout]    |            ------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 33 |     tx: mpsc::Sender<QueryMessage>,
[INFO] [stdout]    |     ^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `DhtNode` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `remove_node`, `mark_failed`, `refresh_stale`, `size`, and `all_nodes` are never used
[INFO] [stdout]    --> crates/core/src/dht/routing_table.rs:115:12
[INFO] [stdout]     |
[INFO] [stdout]  29 | impl RoutingTable {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 115 |     pub fn remove_node(&mut self, node_id: &[u8; 20]) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 126 |     pub fn mark_failed(&mut self, node_id: &[u8; 20]) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 142 |     pub fn refresh_stale(&mut self) -> Vec<[u8; 20]> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 170 |     pub fn size(&self) -> usize {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 174 |     pub fn all_nodes(&self) -> Vec<NodeInfo> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `QUERY_TIMEOUT` is never used
[INFO] [stdout]   --> crates/core/src/dht/query.rs:18:7
[INFO] [stdout]    |
[INFO] [stdout] 18 | const QUERY_TIMEOUT: Duration = Duration::from_secs(5);
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_CONCURRENT_QUERIES` is never used
[INFO] [stdout]   --> crates/core/src/dht/query.rs:19:7
[INFO] [stdout]    |
[INFO] [stdout] 19 | const MAX_CONCURRENT_QUERIES: usize = 8;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> crates/core/src/dht/query.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub enum QueryMessage {
[INFO] [stdout]    |          ------------ variants in this enum
[INFO] [stdout] 23 |     Ping { id: [u8; 20] },
[INFO] [stdout] 24 |     Pong { id: [u8; 20] },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 25 |     FindNode { id: [u8; 20], target: [u8; 20] },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 26 |     FindNodeResponse { id: [u8; 20], nodes: Vec<NodeInfo> },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 27 |     GetPeers { id: [u8; 20], info_hash: [u8; 20] },
[INFO] [stdout] 28 |     GetPeersResponse { id: [u8; 20], token: [u8; 8], peers: Vec<PeerInfo>, nodes: Vec<NodeInfo> },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 29 |     AnnouncePeer { id: [u8; 20], info_hash: [u8; 20], token: [u8; 8], port: u16 },
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 30 |     AnnouncePeerResponse { id: [u8; 20] },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 31 |     Error { id: [u8; 20], message: String },
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `QueryMessage` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `QueryManager` is never constructed
[INFO] [stdout]   --> crates/core/src/dht/query.rs:48:12
[INFO] [stdout]    |
[INFO] [stdout] 48 | pub struct QueryManager {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/dht/query.rs:55:12
[INFO] [stdout]     |
[INFO] [stdout]  54 | impl QueryManager {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout]  55 |     pub fn new(socket: Arc<UdpSocket>, routing_table: Arc<RwLock<RoutingTable>>) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  72 |     pub async fn ping(&self, addr: SocketAddr) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] ...
[INFO] [stdout]  88 |     pub async fn find_node(&self, target: [u8; 20]) -> Result<Vec<NodeInfo>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub async fn get_peers(&self, info_hash: &[u8; 20]) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |     pub async fn announce_peer(&self, info_hash: &[u8; 20], port: u16) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 169 |     async fn query_node(&self, addr: SocketAddr, transaction_id: u32, msg: QueryMessage) -> Result<Vec<NodeInfo>, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 186 |     async fn query_peers(&self, addr: SocketAddr, transaction_id: u32, msg: QueryMessage) -> Result<(Vec<PeerInfo>, Vec<NodeInfo>),...
[INFO] [stdout]     |              ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 200 |     async fn send_query(&self, transaction_id: u32, addr: SocketAddr, msg: QueryMessage) -> Result<(), Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 209 |     async fn create_pending(&self, transaction_id: u32) -> mpsc::Receiver<QueryMessage> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     async fn handle_responses(&self) {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `am_interested` is never read
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:341:5
[INFO] [stdout]     |
[INFO] [stdout] 333 | pub struct PeerConnection {
[INFO] [stdout]     |            -------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 341 |     am_interested: bool,
[INFO] [stdout]     |     ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `PeerConnection` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `write_message` is never used
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:532:14
[INFO] [stdout]     |
[INFO] [stdout] 347 | impl PeerConnection {
[INFO] [stdout]     | ------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 532 |     async fn write_message(&self, msg: PeerMessage) -> Result<(), Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `has_extension` and `set_extension` are never used
[INFO] [stdout]    --> crates/core/src/peer/handshake.rs:94:12
[INFO] [stdout]     |
[INFO] [stdout]  17 | impl Handshake {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  94 |     pub fn has_extension(&self, bit: usize) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 104 |     pub fn set_extension(&mut self, bit: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_MESSAGE_SIZE` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:100:7
[INFO] [stdout]     |
[INFO] [stdout] 100 | const MAX_MESSAGE_SIZE: usize = 16 * 1024 * 1024; // 16MB
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `READ_TIMEOUT` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:101:7
[INFO] [stdout]     |
[INFO] [stdout] 101 | const READ_TIMEOUT: Duration = Duration::from_secs(30);
[INFO] [stdout]     |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `WRITE_TIMEOUT` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:102:7
[INFO] [stdout]     |
[INFO] [stdout] 102 | const WRITE_TIMEOUT: Duration = Duration::from_secs(30);
[INFO] [stdout]     |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PeerWire` is never constructed
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:104:12
[INFO] [stdout]     |
[INFO] [stdout] 104 | pub struct PeerWire {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `read_message`, `write_message`, and `close` are never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:110:12
[INFO] [stdout]     |
[INFO] [stdout] 109 | impl PeerWire {
[INFO] [stdout]     | ------------- associated items in this implementation
[INFO] [stdout] 110 |     pub fn new(stream: TcpStream) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 117 |     pub async fn read_message(&mut self) -> Result<Option<PeerMessage>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub async fn write_message(&mut self, message: &PeerMessage) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 173 |     pub async fn close(&mut self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Block` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:19:12
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub struct Block {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `with_data`, and `is_complete` are never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:27:12
[INFO] [stdout]    |
[INFO] [stdout] 26 | impl Block {
[INFO] [stdout]    | ---------- associated items in this implementation
[INFO] [stdout] 27 |     pub fn new(piece_index: u32, offset: u32, length: u32) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 36 |     pub fn with_data(piece_index: u32, offset: u32, data: Vec<u8>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 46 |     pub fn is_complete(&self) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `PieceState` is never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:53:10
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub enum PieceState {
[INFO] [stdout]    |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PiecesConfig` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:63:12
[INFO] [stdout]    |
[INFO] [stdout] 63 | pub struct PiecesConfig {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PiecesStats` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:83:12
[INFO] [stdout]    |
[INFO] [stdout] 83 | pub struct PiecesStats {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `PieceSelectionStrategy` is never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:95:11
[INFO] [stdout]    |
[INFO] [stdout] 95 | pub trait PieceSelectionStrategy: Send + Sync {
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RarestFirstStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 107 | pub struct RarestFirstStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RandomFirstStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:127:12
[INFO] [stdout]     |
[INFO] [stdout] 127 | pub struct RandomFirstStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SequentialStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:154:12
[INFO] [stdout]     |
[INFO] [stdout] 154 | pub struct SequentialStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `EndgameStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:178:12
[INFO] [stdout]     |
[INFO] [stdout] 178 | pub struct EndgameStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `index` is never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:15:9
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub struct PieceInfo {
[INFO] [stdout]    |            --------- field in this struct
[INFO] [stdout] 15 |     pub index: u32,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PieceInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `total_size` and `uploaded` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:26:5
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub struct PieceManager {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 26 |     total_size: u64,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     uploaded: u64,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `piece_index`, `offset`, and `data` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 36 | struct PieceWrite {
[INFO] [stdout]    |        ---------- fields in this struct
[INFO] [stdout] 37 |     piece_index: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 38 |     offset: u32,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 39 |     data: Vec<u8>,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `peer_interested` and `priority_pieces` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout]  8 | pub struct PiecePicker {
[INFO] [stdout]    |            ----------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 11 |     peer_interested: BitVec,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 12 |     partial_pieces: HashMap<u32, PartialPiece>,
[INFO] [stdout] 13 |     priority_pieces: Vec<u32>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PiecePicker` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `index` and `last_request` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:19:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | struct PartialPiece {
[INFO] [stdout]    |        ------------ fields in this struct
[INFO] [stdout] 19 |     index: u32,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 22 |     last_request: std::time::Instant,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PartialPiece` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `RandomFirst`, `EndGame`, and `Sequential` are never constructed
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:28:5
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub enum SelectionMode {
[INFO] [stdout]    |          ------------- variants in this enum
[INFO] [stdout] 27 |     RarestFirst,
[INFO] [stdout] 28 |     RandomFirst,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 29 |     EndGame,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 30 |     Sequential,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SelectionMode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> crates/core/src/pieces/piece_picker.rs:45:12
[INFO] [stdout]     |
[INFO] [stdout]  33 | impl PiecePicker {
[INFO] [stdout]     | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  45 |     pub fn update_have_pieces(&mut self, bitfield: &BitVec) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  49 |     pub fn update_peer_interested(&mut self, bitfield: &BitVec) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  53 |     pub fn add_partial_piece(&mut self, index: u32, block_count: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  62 |     pub fn mark_block_requested(&mut self, piece_index: u32, block_index: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  69 |     pub fn mark_block_downloaded(&mut self, piece_index: u32, block_index: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  76 |     pub fn piece_completed(&mut self, piece_index: u32) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 145 |     pub fn cancel_stale_requests(&mut self, timeout: std::time::Duration) -> Vec<(u32, usize)> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HashChecker` is never constructed
[INFO] [stdout]  --> crates/core/src/pieces/hash_checker.rs:8:12
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub struct HashChecker;
[INFO] [stdout]   |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `verify_piece`, `verify_pieces`, and `verify_piece_range` are never used
[INFO] [stdout]   --> crates/core/src/pieces/hash_checker.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 10 | impl HashChecker {
[INFO] [stdout]    | ---------------- associated items in this implementation
[INFO] [stdout] 11 |     pub fn new() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 15 |     pub async fn verify_piece(
[INFO] [stdout]    |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     pub async fn verify_pieces(
[INFO] [stdout]    |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 55 |     pub async fn verify_piece_range(
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DiskWriter` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/disk_writer.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct DiskWriter {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `WriteOperation` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/disk_writer.rs:17:8
[INFO] [stdout]    |
[INFO] [stdout] 17 | struct WriteOperation {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `write`, `write_batch`, `flush`, and `close` are never used
[INFO] [stdout]    --> crates/core/src/storage/disk_writer.rs:24:18
[INFO] [stdout]     |
[INFO] [stdout]  23 | impl DiskWriter {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout]  24 |     pub async fn new(file_path: PathBuf) -> Result<Self, Error> {
[INFO] [stdout]     |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 106 |     pub async fn write(&self, offset: u64, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     pub async fn write_batch(&self, writes: Vec<(u64, Vec<u8>)>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub async fn flush(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub async fn close(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MemoryCache` is never constructed
[INFO] [stdout]  --> crates/core/src/storage/memory_cache.rs:8:12
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub struct MemoryCache {
[INFO] [stdout]   |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CacheKey` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:15:8
[INFO] [stdout]    |
[INFO] [stdout] 15 | struct CacheKey {
[INFO] [stdout]    |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CacheEntry` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:21:8
[INFO] [stdout]    |
[INFO] [stdout] 21 | struct CacheEntry {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `get`, `put`, `get_piece_blocks`, `clear`, and `size` are never used
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:27:12
[INFO] [stdout]    |
[INFO] [stdout] 26 | impl MemoryCache {
[INFO] [stdout]    | ---------------- associated items in this implementation
[INFO] [stdout] 27 |     pub fn new(max_size_mb: usize) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 39 |     pub async fn get(&self, piece_index: u32, block_offset: u32) -> Option<Vec<u8>> {
[INFO] [stdout]    |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 50 |     pub async fn put(&self, piece_index: u32, block_offset: u32, data: Vec<u8>) {
[INFO] [stdout]    |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 72 |     pub async fn get_piece_blocks(&self, piece_index: u32) -> Vec<(u32, Vec<u8>)> {
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 85 |     pub async fn clear(&self) {
[INFO] [stdout]    |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 91 |     pub async fn size(&self) -> usize {
[INFO] [stdout]    |                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FileManager` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct FileManager {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/storage/file_manager.rs:19:12
[INFO] [stdout]     |
[INFO] [stdout]  18 | impl FileManager {
[INFO] [stdout]     | ---------------- associated items in this implementation
[INFO] [stdout]  19 |     pub fn new(base_path: PathBuf, files: Vec<TorrentFile>) -> Result<Self, Error> {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  40 |     pub async fn write(&self, offset: u64, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  49 |     pub async fn write_piece(&self, piece_index: u32, piece_length: u32, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  76 |     pub async fn read(&self, offset: u64, length: u64) -> Result<Vec<u8>, Error> {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 102 |     pub async fn flush_all(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 110 |     pub async fn close_all(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     async fn get_writer(&self, file_path: &Path) -> Result<Arc<DiskWriter>, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 135 |     fn resolve_offset(&self, offset: u64) -> Result<(PathBuf, u64), Error> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub fn total_size(&self) -> u64 {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `downloaded_bytes`, `uploaded_bytes`, `download_rate`, and `upload_rate` are never read
[INFO] [stdout]   --> crates/core/src/downloader.rs:30:5
[INFO] [stdout]    |
[INFO] [stdout] 29 | struct DownloadStats {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 30 |     downloaded_bytes: u64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 31 |     uploaded_bytes: u64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 32 |     download_rate: f64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 33 |     upload_rate: f64,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `peer`, `block_offset`, and `block_length` are never read
[INFO] [stdout]   --> crates/core/src/uploader.rs:63:5
[INFO] [stdout]    |
[INFO] [stdout] 62 | struct UploadRequest {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 63 |     peer: Arc<PeerConnection>,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 64 |     piece_index: u32,
[INFO] [stdout] 65 |     block_offset: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 66 |     block_length: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `UploadRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `config` is never read
[INFO] [stdout]   --> crates/core/src/seeding.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub struct Seeder {
[INFO] [stdout]    |            ------ field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 13 |     config: Arc<Config>,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NatTraversal` is never constructed
[INFO] [stdout]  --> crates/core/src/nat_traversal.rs:7:12
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub struct NatTraversal;
[INFO] [stdout]   |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/nat_traversal.rs:10:12
[INFO] [stdout]     |
[INFO] [stdout]   9 | impl NatTraversal {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout]  10 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  14 |     pub async fn get_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  33 |     async fn get_upnp_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  53 |     async fn get_stun_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  58 |     async fn get_http_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  71 |     pub async fn add_port_mapping(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     pub async fn remove_port_mapping(&self, external_port: u16, protocol: Protocol) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Protocol` is never used
[INFO] [stdout]    --> crates/core/src/nat_traversal.rs:137:10
[INFO] [stdout]     |
[INFO] [stdout] 137 | pub enum Protocol {
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PeerDiscovery` is never constructed
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct PeerDiscovery {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `DiscoveryMethod` is never used
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:16:6
[INFO] [stdout]    |
[INFO] [stdout] 16 | enum DiscoveryMethod {
[INFO] [stdout]    |      ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:24:12
[INFO] [stdout]    |
[INFO] [stdout] 23 | impl PeerDiscovery {
[INFO] [stdout]    | ------------------ associated items in this implementation
[INFO] [stdout] 24 |     pub fn new() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     pub async fn discover_peers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 62 |     async fn discover_via_dht(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 67 |     async fn discover_via_trackers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 72 |     async fn discover_via_lsd(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 77 |     pub async fn add_peer(&self, addr: SocketAddr) {
[INFO] [stdout]    |                  ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 81 |     pub async fn remove_peer(&self, addr: &SocketAddr) {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 85 |     pub async fn known_peers(&self) -> Vec<SocketAddr> {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 89 |     pub async fn clear_stale(&self, max_age: std::time::Duration) {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `active_connections` is never read
[INFO] [stdout]   --> crates/core/src/node_manager.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | struct NodeStats {
[INFO] [stdout]    |        --------- field in this struct
[INFO] [stdout] 23 |     total_peers_discovered: u64,
[INFO] [stdout] 24 |     active_connections: usize,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `NodeStats` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:39:9
[INFO] [stdout]    |
[INFO] [stdout] 39 |         self.uploader.start().await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout]    = note: `#[warn(unused_must_use)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 39 |         let _ = self.uploader.start().await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:56:9
[INFO] [stdout]    |
[INFO] [stdout] 56 |         self.uploader.stop().await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 56 |         let _ = self.uploader.stop().await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:62:9
[INFO] [stdout]    |
[INFO] [stdout] 62 |         self.uploader.add_peer(peer).await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 62 |         let _ = self.uploader.add_peer(peer).await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:66:9
[INFO] [stdout]    |
[INFO] [stdout] 66 |         self.uploader.remove_peer(peer).await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 66 |         let _ = self.uploader.remove_peer(peer).await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::path::PathBuf`
[INFO] [stdout]  --> crates/core/src/torrent.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use std::path::PathBuf;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Decoder` and `Value`
[INFO] [stdout]  --> crates/core/src/tracker.rs:4:22
[INFO] [stdout]   |
[INFO] [stdout] 4 | use crate::bencode::{Decoder, Value};
[INFO] [stdout]   |                      ^^^^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `BTreeMap`
[INFO] [stdout]  --> crates/core/src/dht/routing_table.rs:3:24
[INFO] [stdout]   |
[INFO] [stdout] 3 | use std::collections::{BTreeMap, VecDeque};
[INFO] [stdout]   |                        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]   --> crates/core/src/dht/query.rs:13:15
[INFO] [stdout]    |
[INFO] [stdout] 13 | use tracing::{debug, warn};
[INFO] [stdout]    |               ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `QueryManager`
[INFO] [stdout]  --> crates/core/src/dht/mod.rs:9:17
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use query::{QueryManager, QueryMessage};
[INFO] [stdout]   |                 ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Sha1`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:22:12
[INFO] [stdout]    |
[INFO] [stdout] 22 | use sha1::{Sha1, Digest};
[INFO] [stdout]    |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `BufMut`
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:325:23
[INFO] [stdout]     |
[INFO] [stdout] 325 | use bytes::{BytesMut, BufMut};
[INFO] [stdout]     |                       ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `BufMut` and `BytesMut`
[INFO] [stdout]  --> crates/core/src/peer/message.rs:3:13
[INFO] [stdout]   |
[INFO] [stdout] 3 | use bytes::{BytesMut, BufMut};
[INFO] [stdout]   |             ^^^^^^^^  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PeerMessageId`
[INFO] [stdout]   --> crates/core/src/peer/peer_wire.rs:93:35
[INFO] [stdout]    |
[INFO] [stdout] 93 | use super::message::{PeerMessage, PeerMessageId};
[INFO] [stdout]    |                                   ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `handshake::Handshake`
[INFO] [stdout]  --> crates/core/src/peer/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use handshake::Handshake;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `PeerMessageId` and `PeerMessage`
[INFO] [stdout]   --> crates/core/src/peer/mod.rs:10:19
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub use message::{PeerMessage, PeerMessageId};
[INFO] [stdout]    |                   ^^^^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Path`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:6:17
[INFO] [stdout]   |
[INFO] [stdout] 6 | use std::path::{Path, PathBuf};
[INFO] [stdout]   |                 ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `RwLock`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:8:26
[INFO] [stdout]   |
[INFO] [stdout] 8 | use tokio::sync::{Mutex, RwLock};
[INFO] [stdout]   |                          ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]  --> crates/core/src/pieces/piece_manager.rs:9:21
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::{info, debug};
[INFO] [stdout]   |                     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `VecDeque`
[INFO] [stdout]  --> crates/core/src/pieces/piece_picker.rs:4:33
[INFO] [stdout]   |
[INFO] [stdout] 4 | use std::collections::{HashMap, VecDeque};
[INFO] [stdout]   |                                 ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::sync::Arc`
[INFO] [stdout]  --> crates/core/src/pieces/hash_checker.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use std::sync::Arc;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PieceInfo`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:7:39
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub use piece_manager::{PieceManager, PieceInfo};
[INFO] [stdout]   |                                       ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `SelectionMode`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:8:37
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub use piece_picker::{PiecePicker, SelectionMode};
[INFO] [stdout]   |                                     ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `hash_checker::HashChecker`
[INFO] [stdout]  --> crates/core/src/pieces/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use hash_checker::HashChecker;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::error::Error`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | use crate::error::Error;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `common::types::TorrentFile`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:12:5
[INFO] [stdout]    |
[INFO] [stdout] 12 | use common::types::TorrentFile;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::path::PathBuf`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 13 | use std::path::PathBuf;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::sync::Arc`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:14:5
[INFO] [stdout]    |
[INFO] [stdout] 14 | use std::sync::Arc;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tokio::sync::Mutex`
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:15:5
[INFO] [stdout]    |
[INFO] [stdout] 15 | use tokio::sync::Mutex;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Path`
[INFO] [stdout]  --> crates/core/src/storage/disk_writer.rs:4:17
[INFO] [stdout]   |
[INFO] [stdout] 4 | use std::path::{Path, PathBuf};
[INFO] [stdout]   |                 ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `debug`
[INFO] [stdout]  --> crates/core/src/storage/disk_writer.rs:9:15
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::{debug, error};
[INFO] [stdout]   |               ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Mutex`
[INFO] [stdout]  --> crates/core/src/storage/file_manager.rs:9:19
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tokio::sync::{Mutex, RwLock};
[INFO] [stdout]   |                   ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `disk_writer::DiskWriter`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:7:9
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub use disk_writer::DiskWriter;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `memory_cache::MemoryCache`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:8:9
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub use memory_cache::MemoryCache;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `file_manager::FileManager`
[INFO] [stdout]  --> crates/core/src/storage/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub use file_manager::FileManager;
[INFO] [stdout]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `PieceManager`
[INFO] [stdout]  --> crates/core/src/downloader.rs:5:21
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::pieces::{PieceManager, PiecePicker};
[INFO] [stdout]   |                     ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `TorrentState`
[INFO] [stdout]  --> crates/core/src/downloader.rs:8:31
[INFO] [stdout]   |
[INFO] [stdout] 8 | use common::types::{PeerInfo, TorrentState};
[INFO] [stdout]   |                               ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `mpsc`
[INFO] [stdout]   --> crates/core/src/downloader.rs:12:34
[INFO] [stdout]    |
[INFO] [stdout] 12 | use tokio::sync::{Mutex, RwLock, mpsc};
[INFO] [stdout]    |                                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `crate::pieces::PieceManager`
[INFO] [stdout]  --> crates/core/src/uploader.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use crate::pieces::PieceManager;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tokio::time`
[INFO] [stdout]  --> crates/core/src/uploader.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tokio::time;
[INFO] [stdout]   |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `info`
[INFO] [stdout]   --> crates/core/src/uploader.rs:10:22
[INFO] [stdout]    |
[INFO] [stdout] 10 | use tracing::{debug, info};
[INFO] [stdout]    |                      ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tracing::debug`
[INFO] [stdout]  --> crates/core/src/peer_discovery.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::debug;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `debug` and `info`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:11:15
[INFO] [stdout]    |
[INFO] [stdout] 11 | use tracing::{info, debug};
[INFO] [stdout]    |               ^^^^  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling api v0.1.0 (/opt/rustwide/workdir/crates/api)
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:42:18
[INFO] [stdout]    |
[INFO] [stdout] 42 |         let (tx, mut rx) = mpsc::channel(1000);
[INFO] [stdout]    |                  ----^^
[INFO] [stdout]    |                  |
[INFO] [stdout]    |                  help: remove this `mut`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `IntoResponse` and `body::Body`
[INFO] [stdout]  --> crates/api/src/routes/files.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 |     body::Body,
[INFO] [stdout]   |     ^^^^^^^^^^
[INFO] [stdout] 6 |     response::{Response, IntoResponse},
[INFO] [stdout]   |                          ^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated function `base64::decode`: Use Engine::decode
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:71:32
[INFO] [stdout]    |
[INFO] [stdout] 71 |     let torrent_data = base64::decode(&req.torrent_file)
[INFO] [stdout]    |                                ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:414:17
[INFO] [stdout]     |
[INFO] [stdout] 414 |             let mut buf = BytesMut::with_capacity(4096);
[INFO] [stdout]     |                 ----^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:181:13
[INFO] [stdout]     |
[INFO] [stdout] 181 |         let mut piece_data = Vec::with_capacity(self.piece_length as usize);
[INFO] [stdout]     |             ----^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:220:13
[INFO] [stdout]     |
[INFO] [stdout] 220 |         let mut offset_in_piece = 0;
[INFO] [stdout]     |             ----^^^^^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `path`
[INFO] [stdout]   --> crates/api/src/routes/files.rs:42:10
[INFO] [stdout]    |
[INFO] [stdout] 42 |     Path(path): Path<String>,
[INFO] [stdout]    |          ^^^^ help: if this is intentional, prefix it with an underscore: `_path`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `state`
[INFO] [stdout]   --> crates/api/src/websocket.rs:23:43
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stdout]    |                                           ^^^^^ help: if this is intentional, prefix it with an underscore: `_state`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `tx`
[INFO] [stdout]   --> crates/api/src/websocket.rs:27:10
[INFO] [stdout]    |
[INFO] [stdout] 27 |     let (tx, mut rx) = broadcast::channel(32);
[INFO] [stdout]    |          ^^ help: if this is intentional, prefix it with an underscore: `_tx`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> crates/core/src/lib.rs:440:13
[INFO] [stdout]     |
[INFO] [stdout] 440 |         for mut entry in self.torrents.iter_mut() {
[INFO] [stdout]     |             ----^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling cli v0.1.0 (/opt/rustwide/workdir/crates/cli)
[INFO] [stdout] warning: unused import: `Digest`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:22:18
[INFO] [stdout]    |
[INFO] [stdout] 22 | use sha1::{Sha1, Digest};
[INFO] [stdout]    |                  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `IntoResponse` and `body::Body`
[INFO] [stdout]  --> crates/api/src/routes/files.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 |     body::Body,
[INFO] [stdout]   |     ^^^^^^^^^^
[INFO] [stdout] 6 |     response::{Response, IntoResponse},
[INFO] [stdout]   |                          ^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `addr`
[INFO] [stdout]    --> crates/core/src/dht/query.rs:220:26
[INFO] [stdout]     |
[INFO] [stdout] 220 |                 Ok((len, addr)) => {
[INFO] [stdout]     |                          ^^^^ help: if this is intentional, prefix it with an underscore: `_addr`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `msg`
[INFO] [stdout]    --> crates/core/src/dht/query.rs:200:71
[INFO] [stdout]     |
[INFO] [stdout] 200 |     async fn send_query(&self, transaction_id: u32, addr: SocketAddr, msg: QueryMessage) -> Result<(), Error> {
[INFO] [stdout]     |                                                                       ^^^ help: if this is intentional, prefix it with an underscore: `_msg`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated function `base64::decode`: Use Engine::decode
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:71:32
[INFO] [stdout]    |
[INFO] [stdout] 71 |     let torrent_data = base64::decode(&req.torrent_file)
[INFO] [stdout]    |                                ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `config`
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:37:22
[INFO] [stdout]    |
[INFO] [stdout] 37 |     pub async fn new(config: &Config) -> Result<Self, Error> {
[INFO] [stdout]    |                      ^^^^^^ help: if this is intentional, prefix it with an underscore: `_config`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `port`
[INFO] [stdout]    --> crates/core/src/dht/mod.rs:114:61
[INFO] [stdout]     |
[INFO] [stdout] 114 |                 QueryMessage::AnnouncePeer { id, info_hash, port, .. } => {
[INFO] [stdout]     |                                                             ^^^^ help: try ignoring the field: `port: _`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `buf`
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:414:17
[INFO] [stdout]     |
[INFO] [stdout] 414 |             let mut buf = BytesMut::with_capacity(4096);
[INFO] [stdout]     |                 ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_buf`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `block_count`
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |         let block_count = (self.pieces[piece_index as usize].length as f64 / block_size as f64).ceil() as usize;
[INFO] [stdout]     |             ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_count`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `offset_in_piece`
[INFO] [stdout]    --> crates/core/src/pieces/piece_manager.rs:220:13
[INFO] [stdout]     |
[INFO] [stdout] 220 |         let mut offset_in_piece = 0;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_offset_in_piece`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:91:13
[INFO] [stdout]    |
[INFO] [stdout] 91 |         let mut piece_rarity = vec![0; self.piece_count];
[INFO] [stdout]    |             ----^^^^^^^^^^^^
[INFO] [stdout]    |             |
[INFO] [stdout]    |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `piece_rarity`
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:91:13
[INFO] [stdout]    |
[INFO] [stdout] 91 |         let mut piece_rarity = vec![0; self.piece_count];
[INFO] [stdout]    |             ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_piece_rarity`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `piece_index`
[INFO] [stdout]   --> crates/core/src/pieces/hash_checker.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 58 |         piece_index: u32,
[INFO] [stdout]    |         ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_piece_index`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:113:9
[INFO] [stdout]     |
[INFO] [stdout] 113 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:114:9
[INFO] [stdout]     |
[INFO] [stdout] 114 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:133:9
[INFO] [stdout]     |
[INFO] [stdout] 133 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:134:9
[INFO] [stdout]     |
[INFO] [stdout] 134 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:160:9
[INFO] [stdout]     |
[INFO] [stdout] 160 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `partial_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:161:9
[INFO] [stdout]     |
[INFO] [stdout] 161 |         partial_pieces: &[(u32, usize)],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `priority_pieces`
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:184:9
[INFO] [stdout]     |
[INFO] [stdout] 184 |         priority_pieces: &[u32],
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `old_key`
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:63:26
[INFO] [stdout]    |
[INFO] [stdout] 63 |             if let Some((old_key, old_entry)) = cache.pop_lru() {
[INFO] [stdout]    |                          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_old_key`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_start`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:59:21
[INFO] [stdout]    |
[INFO] [stdout] 59 |             let (_, file_start, file_end) = self.file_offsets.iter()
[INFO] [stdout]    |                     ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_start`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_offset`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:82:29
[INFO] [stdout]    |
[INFO] [stdout] 82 |             let (file_path, file_offset) = self.resolve_offset(current_pos)?;
[INFO] [stdout]    |                             ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_offset`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `writer`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:83:17
[INFO] [stdout]    |
[INFO] [stdout] 83 |             let writer = self.get_writer(&file_path).await?;
[INFO] [stdout]    |                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_writer`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `file_start`
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:85:21
[INFO] [stdout]    |
[INFO] [stdout] 85 |             let (_, file_start, file_end) = self.file_offsets.iter()
[INFO] [stdout]    |                     ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_start`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::path::Path`
[INFO] [stdout]  --> crates/cli/src/commands.rs:7:5
[INFO] [stdout]   |
[INFO] [stdout] 7 | use std::path::Path;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Gauge`
[INFO] [stdout]   --> crates/cli/src/ui.rs:12:60
[INFO] [stdout]    |
[INFO] [stdout] 12 |     widgets::{Block, Borders, Cell, Row, Table, Paragraph, Gauge},
[INFO] [stdout]    |                                                            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tracing::info`
[INFO] [stdout]  --> crates/cli/src/main.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use tracing::info;
[INFO] [stdout]   |     ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `peer`
[INFO] [stdout]    --> crates/core/src/downloader.rs:285:13
[INFO] [stdout]     |
[INFO] [stdout] 285 |         for peer in peers.iter() {
[INFO] [stdout]     |             ^^^^ help: if this is intentional, prefix it with an underscore: `_peer`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `stream`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:57:25
[INFO] [stdout]    |
[INFO] [stdout] 57 |                     Ok((stream, addr)) => {
[INFO] [stdout]    |                         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_stream`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `mgr`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:53:13
[INFO] [stdout]    |
[INFO] [stdout] 53 |         let mgr = self.clone();
[INFO] [stdout]    |             ^^^ help: if this is intentional, prefix it with an underscore: `_mgr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `connection`
[INFO] [stdout]   --> crates/core/src/p2p_network.rs:71:43
[INFO] [stdout]    |
[INFO] [stdout] 71 |     async fn handle_new_connection(&self, connection: PeerConnection) {
[INFO] [stdout]    |                                           ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_connection`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated function `base64::encode`: Use Engine::encode
[INFO] [stdout]   --> crates/cli/src/commands.rs:18:27
[INFO] [stdout]    |
[INFO] [stdout] 18 |     let encoded = base64::encode(&data);
[INFO] [stdout]    |                           ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:62:38
[INFO] [stdout]    |
[INFO] [stdout] 62 |     async fn discover_via_dht(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:67:43
[INFO] [stdout]    |
[INFO] [stdout] 67 |     async fn discover_via_trackers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                           ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `info_hash`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:72:38
[INFO] [stdout]    |
[INFO] [stdout] 72 |     async fn discover_via_lsd(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `max_age`
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:89:37
[INFO] [stdout]    |
[INFO] [stdout] 89 |     pub async fn clear_stale(&self, max_age: std::time::Duration) {
[INFO] [stdout]    |                                     ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_max_age`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `torrents`
[INFO] [stdout]    --> crates/core/src/lib.rs:105:42
[INFO] [stdout]     |
[INFO] [stdout] 105 |     async fn load_state(config: &Config, torrents: &DashMap<String, TorrentHandle>) -> Result<()> {
[INFO] [stdout]     |                                          ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_torrents`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `download_path`
[INFO] [stdout]    --> crates/core/src/lib.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |         let download_path = self.config.paths.download_path.join(&name);
[INFO] [stdout]     |             ^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_download_path`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: type `NodeStats` is more private than the item `NodeManager::stats`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:88:5
[INFO] [stdout]    |
[INFO] [stdout] 88 |     pub async fn stats(&self) -> NodeStats {
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `NodeManager::stats` is reachable at visibility `pub`
[INFO] [stdout]    |
[INFO] [stdout] note: but type `NodeStats` is only usable at visibility `pub(self)`
[INFO] [stdout]   --> crates/core/src/node_manager.rs:22:1
[INFO] [stdout]    |
[INFO] [stdout] 22 | struct NodeStats {
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^
[INFO] [stdout]    = note: `#[warn(private_interfaces)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `stats` is never read
[INFO] [stdout]   --> crates/core/src/lib.rs:43:5
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub struct BitTorrentClient {
[INFO] [stdout]    |            ---------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 43 |     stats: Arc<RwLock<ClientStats>>,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `BitTorrentClient` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ALPHABET` is never used
[INFO] [stdout]    --> crates/core/src/torrent.rs:309:11
[INFO] [stdout]     |
[INFO] [stdout] 309 |     const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
[INFO] [stdout]     |           ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ALPHABET` is never used
[INFO] [stdout]    --> crates/core/src/torrent.rs:313:11
[INFO] [stdout]     |
[INFO] [stdout] 313 |     const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
[INFO] [stdout]     |           ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `tx` is never read
[INFO] [stdout]   --> crates/core/src/dht/mod.rs:33:5
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub struct DhtNode {
[INFO] [stdout]    |            ------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 33 |     tx: mpsc::Sender<QueryMessage>,
[INFO] [stdout]    |     ^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `DhtNode` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `remove_node`, `mark_failed`, `refresh_stale`, `size`, and `all_nodes` are never used
[INFO] [stdout]    --> crates/core/src/dht/routing_table.rs:115:12
[INFO] [stdout]     |
[INFO] [stdout]  29 | impl RoutingTable {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 115 |     pub fn remove_node(&mut self, node_id: &[u8; 20]) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 126 |     pub fn mark_failed(&mut self, node_id: &[u8; 20]) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 142 |     pub fn refresh_stale(&mut self) -> Vec<[u8; 20]> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 170 |     pub fn size(&self) -> usize {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 174 |     pub fn all_nodes(&self) -> Vec<NodeInfo> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `QUERY_TIMEOUT` is never used
[INFO] [stdout]   --> crates/core/src/dht/query.rs:18:7
[INFO] [stdout]    |
[INFO] [stdout] 18 | const QUERY_TIMEOUT: Duration = Duration::from_secs(5);
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_CONCURRENT_QUERIES` is never used
[INFO] [stdout]   --> crates/core/src/dht/query.rs:19:7
[INFO] [stdout]    |
[INFO] [stdout] 19 | const MAX_CONCURRENT_QUERIES: usize = 8;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple variants are never constructed
[INFO] [stdout]   --> crates/core/src/dht/query.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub enum QueryMessage {
[INFO] [stdout]    |          ------------ variants in this enum
[INFO] [stdout] 23 |     Ping { id: [u8; 20] },
[INFO] [stdout] 24 |     Pong { id: [u8; 20] },
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 25 |     FindNode { id: [u8; 20], target: [u8; 20] },
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 26 |     FindNodeResponse { id: [u8; 20], nodes: Vec<NodeInfo> },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 27 |     GetPeers { id: [u8; 20], info_hash: [u8; 20] },
[INFO] [stdout] 28 |     GetPeersResponse { id: [u8; 20], token: [u8; 8], peers: Vec<PeerInfo>, nodes: Vec<NodeInfo> },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 29 |     AnnouncePeer { id: [u8; 20], info_hash: [u8; 20], token: [u8; 8], port: u16 },
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 30 |     AnnouncePeerResponse { id: [u8; 20] },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 31 |     Error { id: [u8; 20], message: String },
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `QueryMessage` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `QueryManager` is never constructed
[INFO] [stdout]   --> crates/core/src/dht/query.rs:48:12
[INFO] [stdout]    |
[INFO] [stdout] 48 | pub struct QueryManager {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/dht/query.rs:55:12
[INFO] [stdout]     |
[INFO] [stdout]  54 | impl QueryManager {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout]  55 |     pub fn new(socket: Arc<UdpSocket>, routing_table: Arc<RwLock<RoutingTable>>) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  72 |     pub async fn ping(&self, addr: SocketAddr) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] ...
[INFO] [stdout]  88 |     pub async fn find_node(&self, target: [u8; 20]) -> Result<Vec<NodeInfo>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub async fn get_peers(&self, info_hash: &[u8; 20]) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |     pub async fn announce_peer(&self, info_hash: &[u8; 20], port: u16) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 169 |     async fn query_node(&self, addr: SocketAddr, transaction_id: u32, msg: QueryMessage) -> Result<Vec<NodeInfo>, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 186 |     async fn query_peers(&self, addr: SocketAddr, transaction_id: u32, msg: QueryMessage) -> Result<(Vec<PeerInfo>, Vec<NodeInfo>),...
[INFO] [stdout]     |              ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 200 |     async fn send_query(&self, transaction_id: u32, addr: SocketAddr, msg: QueryMessage) -> Result<(), Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 209 |     async fn create_pending(&self, transaction_id: u32) -> mpsc::Receiver<QueryMessage> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 215 |     async fn handle_responses(&self) {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `am_interested` is never read
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:341:5
[INFO] [stdout]     |
[INFO] [stdout] 333 | pub struct PeerConnection {
[INFO] [stdout]     |            -------------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 341 |     am_interested: bool,
[INFO] [stdout]     |     ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `PeerConnection` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `write_message` is never used
[INFO] [stdout]    --> crates/core/src/peer/connection.rs:532:14
[INFO] [stdout]     |
[INFO] [stdout] 347 | impl PeerConnection {
[INFO] [stdout]     | ------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 532 |     async fn write_message(&self, msg: PeerMessage) -> Result<(), Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MAX_MESSAGE_SIZE` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:100:7
[INFO] [stdout]     |
[INFO] [stdout] 100 | const MAX_MESSAGE_SIZE: usize = 16 * 1024 * 1024; // 16MB
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `READ_TIMEOUT` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:101:7
[INFO] [stdout]     |
[INFO] [stdout] 101 | const READ_TIMEOUT: Duration = Duration::from_secs(30);
[INFO] [stdout]     |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `WRITE_TIMEOUT` is never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:102:7
[INFO] [stdout]     |
[INFO] [stdout] 102 | const WRITE_TIMEOUT: Duration = Duration::from_secs(30);
[INFO] [stdout]     |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PeerWire` is never constructed
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:104:12
[INFO] [stdout]     |
[INFO] [stdout] 104 | pub struct PeerWire {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `read_message`, `write_message`, and `close` are never used
[INFO] [stdout]    --> crates/core/src/peer/peer_wire.rs:110:12
[INFO] [stdout]     |
[INFO] [stdout] 109 | impl PeerWire {
[INFO] [stdout]     | ------------- associated items in this implementation
[INFO] [stdout] 110 |     pub fn new(stream: TcpStream) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 117 |     pub async fn read_message(&mut self) -> Result<Option<PeerMessage>, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 164 |     pub async fn write_message(&mut self, message: &PeerMessage) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 173 |     pub async fn close(&mut self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Block` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:19:12
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub struct Block {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `with_data`, and `is_complete` are never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:27:12
[INFO] [stdout]    |
[INFO] [stdout] 26 | impl Block {
[INFO] [stdout]    | ---------- associated items in this implementation
[INFO] [stdout] 27 |     pub fn new(piece_index: u32, offset: u32, length: u32) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 36 |     pub fn with_data(piece_index: u32, offset: u32, data: Vec<u8>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 46 |     pub fn is_complete(&self) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `PieceState` is never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:53:10
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub enum PieceState {
[INFO] [stdout]    |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PiecesConfig` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:63:12
[INFO] [stdout]    |
[INFO] [stdout] 63 | pub struct PiecesConfig {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PiecesStats` is never constructed
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:83:12
[INFO] [stdout]    |
[INFO] [stdout] 83 | pub struct PiecesStats {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `PieceSelectionStrategy` is never used
[INFO] [stdout]   --> crates/core/src/pieces/mod.rs:95:11
[INFO] [stdout]    |
[INFO] [stdout] 95 | pub trait PieceSelectionStrategy: Send + Sync {
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RarestFirstStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:107:12
[INFO] [stdout]     |
[INFO] [stdout] 107 | pub struct RarestFirstStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RandomFirstStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:127:12
[INFO] [stdout]     |
[INFO] [stdout] 127 | pub struct RandomFirstStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SequentialStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:154:12
[INFO] [stdout]     |
[INFO] [stdout] 154 | pub struct SequentialStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `EndgameStrategy` is never constructed
[INFO] [stdout]    --> crates/core/src/pieces/mod.rs:178:12
[INFO] [stdout]     |
[INFO] [stdout] 178 | pub struct EndgameStrategy;
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `index` is never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:15:9
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub struct PieceInfo {
[INFO] [stdout]    |            --------- field in this struct
[INFO] [stdout] 15 |     pub index: u32,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PieceInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `total_size` and `uploaded` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:26:5
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub struct PieceManager {
[INFO] [stdout]    |            ------------ fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 26 |     total_size: u64,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     uploaded: u64,
[INFO] [stdout]    |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `piece_index`, `offset`, and `data` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_manager.rs:37:5
[INFO] [stdout]    |
[INFO] [stdout] 36 | struct PieceWrite {
[INFO] [stdout]    |        ---------- fields in this struct
[INFO] [stdout] 37 |     piece_index: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 38 |     offset: u32,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 39 |     data: Vec<u8>,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `peer_interested` and `priority_pieces` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout]  8 | pub struct PiecePicker {
[INFO] [stdout]    |            ----------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 11 |     peer_interested: BitVec,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout] 12 |     partial_pieces: HashMap<u32, PartialPiece>,
[INFO] [stdout] 13 |     priority_pieces: Vec<u32>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PiecePicker` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `index` and `last_request` are never read
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:19:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | struct PartialPiece {
[INFO] [stdout]    |        ------------ fields in this struct
[INFO] [stdout] 19 |     index: u32,
[INFO] [stdout]    |     ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 22 |     last_request: std::time::Instant,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `PartialPiece` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `RandomFirst`, `EndGame`, and `Sequential` are never constructed
[INFO] [stdout]   --> crates/core/src/pieces/piece_picker.rs:28:5
[INFO] [stdout]    |
[INFO] [stdout] 26 | pub enum SelectionMode {
[INFO] [stdout]    |          ------------- variants in this enum
[INFO] [stdout] 27 |     RarestFirst,
[INFO] [stdout] 28 |     RandomFirst,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 29 |     EndGame,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 30 |     Sequential,
[INFO] [stdout]    |     ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SelectionMode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> crates/core/src/pieces/piece_picker.rs:45:12
[INFO] [stdout]     |
[INFO] [stdout]  33 | impl PiecePicker {
[INFO] [stdout]     | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  45 |     pub fn update_have_pieces(&mut self, bitfield: &BitVec) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  49 |     pub fn update_peer_interested(&mut self, bitfield: &BitVec) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  53 |     pub fn add_partial_piece(&mut self, index: u32, block_count: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  62 |     pub fn mark_block_requested(&mut self, piece_index: u32, block_index: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  69 |     pub fn mark_block_downloaded(&mut self, piece_index: u32, block_index: usize) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  76 |     pub fn piece_completed(&mut self, piece_index: u32) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 145 |     pub fn cancel_stale_requests(&mut self, timeout: std::time::Duration) -> Vec<(u32, usize)> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HashChecker` is never constructed
[INFO] [stdout]  --> crates/core/src/pieces/hash_checker.rs:8:12
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub struct HashChecker;
[INFO] [stdout]   |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `verify_piece`, `verify_pieces`, and `verify_piece_range` are never used
[INFO] [stdout]   --> crates/core/src/pieces/hash_checker.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 10 | impl HashChecker {
[INFO] [stdout]    | ---------------- associated items in this implementation
[INFO] [stdout] 11 |     pub fn new() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 15 |     pub async fn verify_piece(
[INFO] [stdout]    |                  ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     pub async fn verify_pieces(
[INFO] [stdout]    |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 55 |     pub async fn verify_piece_range(
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DiskWriter` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/disk_writer.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct DiskWriter {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `WriteOperation` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/disk_writer.rs:17:8
[INFO] [stdout]    |
[INFO] [stdout] 17 | struct WriteOperation {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `write`, `write_batch`, `flush`, and `close` are never used
[INFO] [stdout]    --> crates/core/src/storage/disk_writer.rs:24:18
[INFO] [stdout]     |
[INFO] [stdout]  23 | impl DiskWriter {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout]  24 |     pub async fn new(file_path: PathBuf) -> Result<Self, Error> {
[INFO] [stdout]     |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 106 |     pub async fn write(&self, offset: u64, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     pub async fn write_batch(&self, writes: Vec<(u64, Vec<u8>)>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 125 |     pub async fn flush(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 133 |     pub async fn close(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MemoryCache` is never constructed
[INFO] [stdout]  --> crates/core/src/storage/memory_cache.rs:8:12
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub struct MemoryCache {
[INFO] [stdout]   |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CacheKey` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:15:8
[INFO] [stdout]    |
[INFO] [stdout] 15 | struct CacheKey {
[INFO] [stdout]    |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CacheEntry` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:21:8
[INFO] [stdout]    |
[INFO] [stdout] 21 | struct CacheEntry {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `get`, `put`, `get_piece_blocks`, `clear`, and `size` are never used
[INFO] [stdout]   --> crates/core/src/storage/memory_cache.rs:27:12
[INFO] [stdout]    |
[INFO] [stdout] 26 | impl MemoryCache {
[INFO] [stdout]    | ---------------- associated items in this implementation
[INFO] [stdout] 27 |     pub fn new(max_size_mb: usize) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 39 |     pub async fn get(&self, piece_index: u32, block_offset: u32) -> Option<Vec<u8>> {
[INFO] [stdout]    |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 50 |     pub async fn put(&self, piece_index: u32, block_offset: u32, data: Vec<u8>) {
[INFO] [stdout]    |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 72 |     pub async fn get_piece_blocks(&self, piece_index: u32) -> Vec<(u32, Vec<u8>)> {
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 85 |     pub async fn clear(&self) {
[INFO] [stdout]    |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 91 |     pub async fn size(&self) -> usize {
[INFO] [stdout]    |                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FileManager` is never constructed
[INFO] [stdout]   --> crates/core/src/storage/file_manager.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct FileManager {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/storage/file_manager.rs:19:12
[INFO] [stdout]     |
[INFO] [stdout]  18 | impl FileManager {
[INFO] [stdout]     | ---------------- associated items in this implementation
[INFO] [stdout]  19 |     pub fn new(base_path: PathBuf, files: Vec<TorrentFile>) -> Result<Self, Error> {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  40 |     pub async fn write(&self, offset: u64, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  49 |     pub async fn write_piece(&self, piece_index: u32, piece_length: u32, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  76 |     pub async fn read(&self, offset: u64, length: u64) -> Result<Vec<u8>, Error> {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 102 |     pub async fn flush_all(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 110 |     pub async fn close_all(&self) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     async fn get_writer(&self, file_path: &Path) -> Result<Arc<DiskWriter>, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 135 |     fn resolve_offset(&self, offset: u64) -> Result<(PathBuf, u64), Error> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 146 |     pub fn total_size(&self) -> u64 {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `downloaded_bytes`, `uploaded_bytes`, `download_rate`, and `upload_rate` are never read
[INFO] [stdout]   --> crates/core/src/downloader.rs:30:5
[INFO] [stdout]    |
[INFO] [stdout] 29 | struct DownloadStats {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 30 |     downloaded_bytes: u64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 31 |     uploaded_bytes: u64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^
[INFO] [stdout] 32 |     download_rate: f64,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout] 33 |     upload_rate: f64,
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `peer`, `block_offset`, and `block_length` are never read
[INFO] [stdout]   --> crates/core/src/uploader.rs:63:5
[INFO] [stdout]    |
[INFO] [stdout] 62 | struct UploadRequest {
[INFO] [stdout]    |        ------------- fields in this struct
[INFO] [stdout] 63 |     peer: Arc<PeerConnection>,
[INFO] [stdout]    |     ^^^^
[INFO] [stdout] 64 |     piece_index: u32,
[INFO] [stdout] 65 |     block_offset: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 66 |     block_length: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `UploadRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `config` is never read
[INFO] [stdout]   --> crates/core/src/seeding.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 10 | pub struct Seeder {
[INFO] [stdout]    |            ------ field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 13 |     config: Arc<Config>,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NatTraversal` is never constructed
[INFO] [stdout]  --> crates/core/src/nat_traversal.rs:7:12
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub struct NatTraversal;
[INFO] [stdout]   |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> crates/core/src/nat_traversal.rs:10:12
[INFO] [stdout]     |
[INFO] [stdout]   9 | impl NatTraversal {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout]  10 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  14 |     pub async fn get_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  33 |     async fn get_upnp_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  53 |     async fn get_stun_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  58 |     async fn get_http_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  71 |     pub async fn add_port_mapping(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 118 |     pub async fn remove_port_mapping(&self, external_port: u16, protocol: Protocol) -> Result<(), Error> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `Protocol` is never used
[INFO] [stdout]    --> crates/core/src/nat_traversal.rs:137:10
[INFO] [stdout]     |
[INFO] [stdout] 137 | pub enum Protocol {
[INFO] [stdout]     |          ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PeerDiscovery` is never constructed
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:11:12
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub struct PeerDiscovery {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `path`
[INFO] [stdout]   --> crates/api/src/routes/files.rs:42:10
[INFO] [stdout]    |
[INFO] [stdout] 42 |     Path(path): Path<String>,
[INFO] [stdout]    |          ^^^^ help: if this is intentional, prefix it with an underscore: `_path`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `DiscoveryMethod` is never used
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:16:6
[INFO] [stdout]    |
[INFO] [stdout] 16 | enum DiscoveryMethod {
[INFO] [stdout]    |      ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]   --> crates/core/src/peer_discovery.rs:24:12
[INFO] [stdout]    |
[INFO] [stdout] 23 | impl PeerDiscovery {
[INFO] [stdout]    | ------------------ associated items in this implementation
[INFO] [stdout] 24 |     pub fn new() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 31 |     pub async fn discover_peers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |                  ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 62 |     async fn discover_via_dht(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 67 |     async fn discover_via_trackers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 72 |     async fn discover_via_lsd(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 77 |     pub async fn add_peer(&self, addr: SocketAddr) {
[INFO] [stdout]    |                  ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 81 |     pub async fn remove_peer(&self, addr: &SocketAddr) {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 85 |     pub async fn known_peers(&self) -> Vec<SocketAddr> {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 89 |     pub async fn clear_stale(&self, max_age: std::time::Duration) {
[INFO] [stdout]    |                  ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `active_connections` is never read
[INFO] [stdout]   --> crates/core/src/node_manager.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | struct NodeStats {
[INFO] [stdout]    |        --------- field in this struct
[INFO] [stdout] 23 |     total_peers_discovered: u64,
[INFO] [stdout] 24 |     active_connections: usize,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `NodeStats` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `state`
[INFO] [stdout]   --> crates/api/src/websocket.rs:23:43
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stdout]    |                                           ^^^^^ help: if this is intentional, prefix it with an underscore: `_state`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `tx`
[INFO] [stdout]   --> crates/api/src/websocket.rs:27:10
[INFO] [stdout]    |
[INFO] [stdout] 27 |     let (tx, mut rx) = broadcast::channel(32);
[INFO] [stdout]    |          ^^ help: if this is intentional, prefix it with an underscore: `_tx`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:39:9
[INFO] [stdout]    |
[INFO] [stdout] 39 |         self.uploader.start().await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout]    = note: `#[warn(unused_must_use)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 39 |         let _ = self.uploader.start().await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:56:9
[INFO] [stdout]    |
[INFO] [stdout] 56 |         self.uploader.stop().await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 56 |         let _ = self.uploader.stop().await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:62:9
[INFO] [stdout]    |
[INFO] [stdout] 62 |         self.uploader.add_peer(peer).await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 62 |         let _ = self.uploader.add_peer(peer).await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused `std::result::Result` that must be used
[INFO] [stdout]   --> crates/core/src/seeding.rs:66:9
[INFO] [stdout]    |
[INFO] [stdout] 66 |         self.uploader.remove_peer(peer).await;
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stdout] help: use `let _ = ...` to ignore the resulting value
[INFO] [stdout]    |
[INFO] [stdout] 66 |         let _ = self.uploader.remove_peer(peer).await;
[INFO] [stdout]    |         +++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Backend`
[INFO] [stdout]   --> crates/cli/src/ui.rs:10:15
[INFO] [stdout]    |
[INFO] [stdout] 10 |     backend::{Backend, CrosstermBackend},
[INFO] [stdout]    |               ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TuiApp` is never constructed
[INFO] [stdout]   --> crates/cli/src/ui.rs:21:12
[INFO] [stdout]    |
[INFO] [stdout] 21 | pub struct TuiApp {
[INFO] [stdout]    |            ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TorrentInfo` is never constructed
[INFO] [stdout]   --> crates/cli/src/ui.rs:27:8
[INFO] [stdout]    |
[INFO] [stdout] 27 | struct TorrentInfo {
[INFO] [stdout]    |        ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `run`, `draw`, `draw_torrents`, `handle_events`, and `update_torrents` are never used
[INFO] [stdout]    --> crates/cli/src/ui.rs:36:12
[INFO] [stdout]     |
[INFO] [stdout]  35 | impl TuiApp {
[INFO] [stdout]     | ----------- associated items in this implementation
[INFO] [stdout]  36 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  45 |     pub async fn run(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stdout]     |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout]  80 |     fn draw(&mut self, f: &mut Frame<'_>) {
[INFO] [stdout]     |        ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     fn draw_torrents(&self, f: &mut Frame<'_>, area: Rect) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 151 |     fn handle_events(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 169 |     async fn update_torrents(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TorrentData` is never constructed
[INFO] [stdout]    --> crates/cli/src/ui.rs:188:8
[INFO] [stdout]     |
[INFO] [stdout] 188 | struct TorrentData {
[INFO] [stdout]     |        ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]    Compiling node v0.1.0 (/opt/rustwide/workdir/crates/node)
[INFO] [stdout] warning: unused imports: `IntoResponse` and `body::Body`
[INFO] [stdout]  --> crates/api/src/routes/files.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 |     body::Body,
[INFO] [stdout]   |     ^^^^^^^^^^
[INFO] [stdout] 6 |     response::{Response, IntoResponse},
[INFO] [stdout]   |                          ^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Router`, `delete`, `get`, `http::Method`, and `post`
[INFO] [stdout]   --> crates/api/src/main.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout] 11 |     Router,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 12 |     routing::{get, post, delete},
[INFO] [stdout]    |               ^^^  ^^^^  ^^^^^^
[INFO] [stdout] 13 |     http::Method,
[INFO] [stdout]    |     ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `Any` and `CorsLayer`
[INFO] [stdout]   --> crates/api/src/main.rs:15:24
[INFO] [stdout]    |
[INFO] [stdout] 15 | use tower_http::cors::{CorsLayer, Any};
[INFO] [stdout]    |                        ^^^^^^^^^  ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `std::future`
[INFO] [stdout]   --> crates/api/src/main.rs:17:5
[INFO] [stdout]    |
[INFO] [stdout] 17 | use std::future;
[INFO] [stdout]    |     ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `tokio::sync::broadcast`
[INFO] [stdout]   --> crates/api/src/main.rs:18:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | use tokio::sync::broadcast;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated function `base64::decode`: Use Engine::decode
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:71:32
[INFO] [stdout]    |
[INFO] [stdout] 71 |     let torrent_data = base64::decode(&req.torrent_file)
[INFO] [stdout]    |                                ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `path`
[INFO] [stdout]   --> crates/api/src/routes/files.rs:42:10
[INFO] [stdout]    |
[INFO] [stdout] 42 |     Path(path): Path<String>,
[INFO] [stdout]    |          ^^^^ help: if this is intentional, prefix it with an underscore: `_path`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `state`
[INFO] [stdout]   --> crates/api/src/websocket.rs:23:43
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stdout]    |                                           ^^^^^ help: if this is intentional, prefix it with an underscore: `_state`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `tx`
[INFO] [stdout]   --> crates/api/src/websocket.rs:27:10
[INFO] [stdout]    |
[INFO] [stdout] 27 |     let (tx, mut rx) = broadcast::channel(32);
[INFO] [stdout]    |          ^^ help: if this is intentional, prefix it with an underscore: `_tx`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `shutdown_signal` is never used
[INFO] [stdout]   --> crates/api/src/main.rs:56:10
[INFO] [stdout]    |
[INFO] [stdout] 56 | async fn shutdown_signal() {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AddTorrentRequest` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:13:12
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub struct AddTorrentRequest {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AddMagnetRequest` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:18:12
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub struct AddMagnetRequest {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RemoveTorrentRequest` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:23:12
[INFO] [stdout]    |
[INFO] [stdout] 23 | pub struct RemoveTorrentRequest {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TorrentResponse` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:28:12
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub struct TorrentResponse {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_torrents` is never used
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:43:14
[INFO] [stdout]    |
[INFO] [stdout] 43 | pub async fn list_torrents(
[INFO] [stdout]    |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `add_torrent` is never used
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:66:14
[INFO] [stdout]    |
[INFO] [stdout] 66 | pub async fn add_torrent(
[INFO] [stdout]    |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `add_magnet` is never used
[INFO] [stdout]   --> crates/api/src/routes/torrents.rs:98:14
[INFO] [stdout]    |
[INFO] [stdout] 98 | pub async fn add_magnet(
[INFO] [stdout]    |              ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_torrent` is never used
[INFO] [stdout]    --> crates/api/src/routes/torrents.rs:125:14
[INFO] [stdout]     |
[INFO] [stdout] 125 | pub async fn get_torrent(
[INFO] [stdout]     |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_torrent` is never used
[INFO] [stdout]    --> crates/api/src/routes/torrents.rs:149:14
[INFO] [stdout]     |
[INFO] [stdout] 149 | pub async fn remove_torrent(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `pause_torrent` is never used
[INFO] [stdout]    --> crates/api/src/routes/torrents.rs:160:14
[INFO] [stdout]     |
[INFO] [stdout] 160 | pub async fn pause_torrent(
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resume_torrent` is never used
[INFO] [stdout]    --> crates/api/src/routes/torrents.rs:170:14
[INFO] [stdout]     |
[INFO] [stdout] 170 | pub async fn resume_torrent(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `StatsResponse` is never constructed
[INFO] [stdout]  --> crates/api/src/routes/stats.rs:9:12
[INFO] [stdout]   |
[INFO] [stdout] 9 | pub struct StatsResponse {
[INFO] [stdout]   |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_stats` is never used
[INFO] [stdout]   --> crates/api/src/routes/stats.rs:19:14
[INFO] [stdout]    |
[INFO] [stdout] 19 | pub async fn get_stats(
[INFO] [stdout]    |              ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_files` is never used
[INFO] [stdout]   --> crates/api/src/routes/files.rs:13:14
[INFO] [stdout]    |
[INFO] [stdout] 13 | pub async fn list_files(
[INFO] [stdout]    |              ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `get_file` is never used
[INFO] [stdout]   --> crates/api/src/routes/files.rs:41:14
[INFO] [stdout]    |
[INFO] [stdout] 41 | pub async fn get_file(
[INFO] [stdout]    |              ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `FileInfo` is never constructed
[INFO] [stdout]   --> crates/api/src/routes/files.rs:50:12
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub struct FileInfo {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `websocket_handler` is never used
[INFO] [stdout]   --> crates/api/src/websocket.rs:16:14
[INFO] [stdout]    |
[INFO] [stdout] 16 | pub async fn websocket_handler(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `handle_socket` is never used
[INFO] [stdout]   --> crates/api/src/websocket.rs:23:10
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stdout]    |          ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `logging_middleware` is never used
[INFO] [stdout]   --> crates/api/src/middleware.rs:14:14
[INFO] [stdout]    |
[INFO] [stdout] 14 | pub async fn logging_middleware(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `auth_middleware` is never used
[INFO] [stdout]   --> crates/api/src/middleware.rs:30:14
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub async fn auth_middleware(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_token` is never used
[INFO] [stdout]   --> crates/api/src/middleware.rs:59:4
[INFO] [stdout]    |
[INFO] [stdout] 59 | fn validate_token(_token: &str, _secret: &str) -> bool {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cors_middleware` is never used
[INFO] [stdout]   --> crates/api/src/middleware.rs:64:14
[INFO] [stdout]    |
[INFO] [stdout] 64 | pub async fn cors_middleware(
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AppState` is never constructed
[INFO] [stdout]  --> crates/api/src/state.rs:8:12
[INFO] [stdout]   |
[INFO] [stdout] 8 | pub struct AppState {
[INFO] [stdout]   |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 47s
[INFO] [stderr] warning: the following packages contain code that will be rejected by a future version of Rust: proc-macro-error2 v2.0.1
[INFO] [stderr] note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
[INFO] running `Command { std: "docker" "inspect" "68c3d0501d1cede412b1a2323cd273c4d3d3029c4b66d8ede7c846aeed451ae5", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "68c3d0501d1cede412b1a2323cd273c4d3d3029c4b66d8ede7c846aeed451ae5", kill_on_drop: false }`
[INFO] [stdout] 68c3d0501d1cede412b1a2323cd273c4d3d3029c4b66d8ede7c846aeed451ae5
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] d03a9b6672eb303bcace6d9a53988ce43cce9ea065763c634e7223ab90e1fd87
[INFO] running `Command { std: "docker" "start" "-a" "d03a9b6672eb303bcace6d9a53988ce43cce9ea065763c634e7223ab90e1fd87", kill_on_drop: false }`
[INFO] [stderr] warning: unused import: `std::path::PathBuf`
[INFO] [stderr]  --> crates/core/src/torrent.rs:8:5
[INFO] [stderr]   |
[INFO] [stderr] 8 | use std::path::PathBuf;
[INFO] [stderr]   |     ^^^^^^^^^^^^^^^^^^
[INFO] [stderr]   |
[INFO] [stderr]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused imports: `Decoder` and `Value`
[INFO] [stderr]  --> crates/core/src/tracker.rs:4:22
[INFO] [stderr]   |
[INFO] [stderr] 4 | use crate::bencode::{Decoder, Value};
[INFO] [stderr]   |                      ^^^^^^^  ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `BTreeMap`
[INFO] [stderr]  --> crates/core/src/dht/routing_table.rs:3:24
[INFO] [stderr]   |
[INFO] [stderr] 3 | use std::collections::{BTreeMap, VecDeque};
[INFO] [stderr]   |                        ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `debug`
[INFO] [stderr]   --> crates/core/src/dht/query.rs:13:15
[INFO] [stderr]    |
[INFO] [stderr] 13 | use tracing::{debug, warn};
[INFO] [stderr]    |               ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `QueryManager`
[INFO] [stderr]  --> crates/core/src/dht/mod.rs:9:17
[INFO] [stderr]   |
[INFO] [stderr] 9 | pub use query::{QueryManager, QueryMessage};
[INFO] [stderr]   |                 ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `Sha1`
[INFO] [stderr]   --> crates/core/src/dht/mod.rs:22:12
[INFO] [stderr]    |
[INFO] [stderr] 22 | use sha1::{Sha1, Digest};
[INFO] [stderr]    |            ^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `BufMut`
[INFO] [stderr]    --> crates/core/src/peer/connection.rs:325:23
[INFO] [stderr]     |
[INFO] [stderr] 325 | use bytes::{BytesMut, BufMut};
[INFO] [stderr]     |                       ^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused imports: `BufMut` and `BytesMut`
[INFO] [stderr]  --> crates/core/src/peer/message.rs:3:13
[INFO] [stderr]   |
[INFO] [stderr] 3 | use bytes::{BytesMut, BufMut};
[INFO] [stderr]   |             ^^^^^^^^  ^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `PeerMessageId`
[INFO] [stderr]   --> crates/core/src/peer/peer_wire.rs:93:35
[INFO] [stderr]    |
[INFO] [stderr] 93 | use super::message::{PeerMessage, PeerMessageId};
[INFO] [stderr]    |                                   ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `handshake::Handshake`
[INFO] [stderr]  --> crates/core/src/peer/mod.rs:9:9
[INFO] [stderr]   |
[INFO] [stderr] 9 | pub use handshake::Handshake;
[INFO] [stderr]   |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused imports: `PeerMessageId` and `PeerMessage`
[INFO] [stderr]   --> crates/core/src/peer/mod.rs:10:19
[INFO] [stderr]    |
[INFO] [stderr] 10 | pub use message::{PeerMessage, PeerMessageId};
[INFO] [stderr]    |                   ^^^^^^^^^^^  ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `Path`
[INFO] [stderr]  --> crates/core/src/pieces/piece_manager.rs:6:17
[INFO] [stderr]   |
[INFO] [stderr] 6 | use std::path::{Path, PathBuf};
[INFO] [stderr]   |                 ^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `RwLock`
[INFO] [stderr]  --> crates/core/src/pieces/piece_manager.rs:8:26
[INFO] [stderr]   |
[INFO] [stderr] 8 | use tokio::sync::{Mutex, RwLock};
[INFO] [stderr]   |                          ^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `debug`
[INFO] [stderr]  --> crates/core/src/pieces/piece_manager.rs:9:21
[INFO] [stderr]   |
[INFO] [stderr] 9 | use tracing::{info, debug};
[INFO] [stderr]   |                     ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `VecDeque`
[INFO] [stderr]  --> crates/core/src/pieces/piece_picker.rs:4:33
[INFO] [stderr]   |
[INFO] [stderr] 4 | use std::collections::{HashMap, VecDeque};
[INFO] [stderr]   |                                 ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `std::sync::Arc`
[INFO] [stderr]  --> crates/core/src/pieces/hash_checker.rs:5:5
[INFO] [stderr]   |
[INFO] [stderr] 5 | use std::sync::Arc;
[INFO] [stderr]   |     ^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `PieceInfo`
[INFO] [stderr]  --> crates/core/src/pieces/mod.rs:7:39
[INFO] [stderr]   |
[INFO] [stderr] 7 | pub use piece_manager::{PieceManager, PieceInfo};
[INFO] [stderr]   |                                       ^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `SelectionMode`
[INFO] [stderr]  --> crates/core/src/pieces/mod.rs:8:37
[INFO] [stderr]   |
[INFO] [stderr] 8 | pub use piece_picker::{PiecePicker, SelectionMode};
[INFO] [stderr]   |                                     ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `hash_checker::HashChecker`
[INFO] [stderr]  --> crates/core/src/pieces/mod.rs:9:9
[INFO] [stderr]   |
[INFO] [stderr] 9 | pub use hash_checker::HashChecker;
[INFO] [stderr]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `crate::error::Error`
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:11:5
[INFO] [stderr]    |
[INFO] [stderr] 11 | use crate::error::Error;
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `common::types::TorrentFile`
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:12:5
[INFO] [stderr]    |
[INFO] [stderr] 12 | use common::types::TorrentFile;
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `std::path::PathBuf`
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:13:5
[INFO] [stderr]    |
[INFO] [stderr] 13 | use std::path::PathBuf;
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `std::sync::Arc`
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:14:5
[INFO] [stderr]    |
[INFO] [stderr] 14 | use std::sync::Arc;
[INFO] [stderr]    |     ^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `tokio::sync::Mutex`
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:15:5
[INFO] [stderr]    |
[INFO] [stderr] 15 | use tokio::sync::Mutex;
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `Path`
[INFO] [stderr]  --> crates/core/src/storage/disk_writer.rs:4:17
[INFO] [stderr]   |
[INFO] [stderr] 4 | use std::path::{Path, PathBuf};
[INFO] [stderr]   |                 ^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `debug`
[INFO] [stderr]  --> crates/core/src/storage/disk_writer.rs:9:15
[INFO] [stderr]   |
[INFO] [stderr] 9 | use tracing::{debug, error};
[INFO] [stderr]   |               ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `Mutex`
[INFO] [stderr]  --> crates/core/src/storage/file_manager.rs:9:19
[INFO] [stderr]   |
[INFO] [stderr] 9 | use tokio::sync::{Mutex, RwLock};
[INFO] [stderr]   |                   ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `disk_writer::DiskWriter`
[INFO] [stderr]  --> crates/core/src/storage/mod.rs:7:9
[INFO] [stderr]   |
[INFO] [stderr] 7 | pub use disk_writer::DiskWriter;
[INFO] [stderr]   |         ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `memory_cache::MemoryCache`
[INFO] [stderr]  --> crates/core/src/storage/mod.rs:8:9
[INFO] [stderr]   |
[INFO] [stderr] 8 | pub use memory_cache::MemoryCache;
[INFO] [stderr]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `file_manager::FileManager`
[INFO] [stderr]  --> crates/core/src/storage/mod.rs:9:9
[INFO] [stderr]   |
[INFO] [stderr] 9 | pub use file_manager::FileManager;
[INFO] [stderr]   |         ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `PieceManager`
[INFO] [stderr]  --> crates/core/src/downloader.rs:5:21
[INFO] [stderr]   |
[INFO] [stderr] 5 | use crate::pieces::{PieceManager, PiecePicker};
[INFO] [stderr]   |                     ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `TorrentState`
[INFO] [stderr]  --> crates/core/src/downloader.rs:8:31
[INFO] [stderr]   |
[INFO] [stderr] 8 | use common::types::{PeerInfo, TorrentState};
[INFO] [stderr]   |                               ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `mpsc`
[INFO] [stderr]   --> crates/core/src/downloader.rs:12:34
[INFO] [stderr]    |
[INFO] [stderr] 12 | use tokio::sync::{Mutex, RwLock, mpsc};
[INFO] [stderr]    |                                  ^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `crate::pieces::PieceManager`
[INFO] [stderr]  --> crates/core/src/uploader.rs:5:5
[INFO] [stderr]   |
[INFO] [stderr] 5 | use crate::pieces::PieceManager;
[INFO] [stderr]   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `tokio::time`
[INFO] [stderr]  --> crates/core/src/uploader.rs:9:5
[INFO] [stderr]   |
[INFO] [stderr] 9 | use tokio::time;
[INFO] [stderr]   |     ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `info`
[INFO] [stderr]   --> crates/core/src/uploader.rs:10:22
[INFO] [stderr]    |
[INFO] [stderr] 10 | use tracing::{debug, info};
[INFO] [stderr]    |                      ^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `tracing::debug`
[INFO] [stderr]  --> crates/core/src/peer_discovery.rs:9:5
[INFO] [stderr]   |
[INFO] [stderr] 9 | use tracing::debug;
[INFO] [stderr]   |     ^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused imports: `debug` and `info`
[INFO] [stderr]   --> crates/core/src/node_manager.rs:11:15
[INFO] [stderr]    |
[INFO] [stderr] 11 | use tracing::{info, debug};
[INFO] [stderr]    |               ^^^^  ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]   --> crates/core/src/dht/mod.rs:42:18
[INFO] [stderr]    |
[INFO] [stderr] 42 |         let (tx, mut rx) = mpsc::channel(1000);
[INFO] [stderr]    |                  ----^^
[INFO] [stderr]    |                  |
[INFO] [stderr]    |                  help: remove this `mut`
[INFO] [stderr]    |
[INFO] [stderr]    = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]    --> crates/core/src/peer/connection.rs:414:17
[INFO] [stderr]     |
[INFO] [stderr] 414 |             let mut buf = BytesMut::with_capacity(4096);
[INFO] [stderr]     |                 ----^^^
[INFO] [stderr]     |                 |
[INFO] [stderr]     |                 help: remove this `mut`
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]    --> crates/core/src/pieces/piece_manager.rs:181:13
[INFO] [stderr]     |
[INFO] [stderr] 181 |         let mut piece_data = Vec::with_capacity(self.piece_length as usize);
[INFO] [stderr]     |             ----^^^^^^^^^^
[INFO] [stderr]     |             |
[INFO] [stderr]     |             help: remove this `mut`
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]    --> crates/core/src/pieces/piece_manager.rs:220:13
[INFO] [stderr]     |
[INFO] [stderr] 220 |         let mut offset_in_piece = 0;
[INFO] [stderr]     |             ----^^^^^^^^^^^^^^^
[INFO] [stderr]     |             |
[INFO] [stderr]     |             help: remove this `mut`
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]    --> crates/core/src/lib.rs:440:13
[INFO] [stderr]     |
[INFO] [stderr] 440 |         for mut entry in self.torrents.iter_mut() {
[INFO] [stderr]     |             ----^^^^^
[INFO] [stderr]     |             |
[INFO] [stderr]     |             help: remove this `mut`
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `Digest`
[INFO] [stderr]   --> crates/core/src/dht/mod.rs:22:18
[INFO] [stderr]    |
[INFO] [stderr] 22 | use sha1::{Sha1, Digest};
[INFO] [stderr]    |                  ^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `addr`
[INFO] [stderr]    --> crates/core/src/dht/query.rs:220:26
[INFO] [stderr]     |
[INFO] [stderr] 220 |                 Ok((len, addr)) => {
[INFO] [stderr]     |                          ^^^^ help: if this is intentional, prefix it with an underscore: `_addr`
[INFO] [stderr]     |
[INFO] [stderr]     = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `msg`
[INFO] [stderr]    --> crates/core/src/dht/query.rs:200:71
[INFO] [stderr]     |
[INFO] [stderr] 200 |     async fn send_query(&self, transaction_id: u32, addr: SocketAddr, msg: QueryMessage) -> Result<(), Error> {
[INFO] [stderr]     |                                                                       ^^^ help: if this is intentional, prefix it with an underscore: `_msg`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `config`
[INFO] [stderr]   --> crates/core/src/dht/mod.rs:37:22
[INFO] [stderr]    |
[INFO] [stderr] 37 |     pub async fn new(config: &Config) -> Result<Self, Error> {
[INFO] [stderr]    |                      ^^^^^^ help: if this is intentional, prefix it with an underscore: `_config`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `port`
[INFO] [stderr]    --> crates/core/src/dht/mod.rs:114:61
[INFO] [stderr]     |
[INFO] [stderr] 114 |                 QueryMessage::AnnouncePeer { id, info_hash, port, .. } => {
[INFO] [stderr]     |                                                             ^^^^ help: try ignoring the field: `port: _`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `buf`
[INFO] [stderr]    --> crates/core/src/peer/connection.rs:414:17
[INFO] [stderr]     |
[INFO] [stderr] 414 |             let mut buf = BytesMut::with_capacity(4096);
[INFO] [stderr]     |                 ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_buf`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `block_count`
[INFO] [stderr]    --> crates/core/src/pieces/piece_manager.rs:183:13
[INFO] [stderr]     |
[INFO] [stderr] 183 |         let block_count = (self.pieces[piece_index as usize].length as f64 / block_size as f64).ceil() as usize;
[INFO] [stderr]     |             ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_count`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `offset_in_piece`
[INFO] [stderr]    --> crates/core/src/pieces/piece_manager.rs:220:13
[INFO] [stderr]     |
[INFO] [stderr] 220 |         let mut offset_in_piece = 0;
[INFO] [stderr]     |             ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_offset_in_piece`
[INFO] [stderr] 
[INFO] [stderr] warning: variable does not need to be mutable
[INFO] [stderr]   --> crates/core/src/pieces/piece_picker.rs:91:13
[INFO] [stderr]    |
[INFO] [stderr] 91 |         let mut piece_rarity = vec![0; self.piece_count];
[INFO] [stderr]    |             ----^^^^^^^^^^^^
[INFO] [stderr]    |             |
[INFO] [stderr]    |             help: remove this `mut`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `piece_rarity`
[INFO] [stderr]   --> crates/core/src/pieces/piece_picker.rs:91:13
[INFO] [stderr]    |
[INFO] [stderr] 91 |         let mut piece_rarity = vec![0; self.piece_count];
[INFO] [stderr]    |             ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_piece_rarity`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `piece_index`
[INFO] [stderr]   --> crates/core/src/pieces/hash_checker.rs:58:9
[INFO] [stderr]    |
[INFO] [stderr] 58 |         piece_index: u32,
[INFO] [stderr]    |         ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_piece_index`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `priority_pieces`
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:113:9
[INFO] [stderr]     |
[INFO] [stderr] 113 |         priority_pieces: &[u32],
[INFO] [stderr]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `partial_pieces`
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:114:9
[INFO] [stderr]     |
[INFO] [stderr] 114 |         partial_pieces: &[(u32, usize)],
[INFO] [stderr]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `priority_pieces`
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:133:9
[INFO] [stderr]     |
[INFO] [stderr] 133 |         priority_pieces: &[u32],
[INFO] [stderr]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `partial_pieces`
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:134:9
[INFO] [stderr]     |
[INFO] [stderr] 134 |         partial_pieces: &[(u32, usize)],
[INFO] [stderr]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `priority_pieces`
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:160:9
[INFO] [stderr]     |
[INFO] [stderr] 160 |         priority_pieces: &[u32],
[INFO] [stderr]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `partial_pieces`
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:161:9
[INFO] [stderr]     |
[INFO] [stderr] 161 |         partial_pieces: &[(u32, usize)],
[INFO] [stderr]     |         ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_partial_pieces`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `priority_pieces`
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:184:9
[INFO] [stderr]     |
[INFO] [stderr] 184 |         priority_pieces: &[u32],
[INFO] [stderr]     |         ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_priority_pieces`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `old_key`
[INFO] [stderr]   --> crates/core/src/storage/memory_cache.rs:63:26
[INFO] [stderr]    |
[INFO] [stderr] 63 |             if let Some((old_key, old_entry)) = cache.pop_lru() {
[INFO] [stderr]    |                          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_old_key`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `file_start`
[INFO] [stderr]   --> crates/core/src/storage/file_manager.rs:59:21
[INFO] [stderr]    |
[INFO] [stderr] 59 |             let (_, file_start, file_end) = self.file_offsets.iter()
[INFO] [stderr]    |                     ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_start`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `file_offset`
[INFO] [stderr]   --> crates/core/src/storage/file_manager.rs:82:29
[INFO] [stderr]    |
[INFO] [stderr] 82 |             let (file_path, file_offset) = self.resolve_offset(current_pos)?;
[INFO] [stderr]    |                             ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_offset`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `writer`
[INFO] [stderr]   --> crates/core/src/storage/file_manager.rs:83:17
[INFO] [stderr]    |
[INFO] [stderr] 83 |             let writer = self.get_writer(&file_path).await?;
[INFO] [stderr]    |                 ^^^^^^ help: if this is intentional, prefix it with an underscore: `_writer`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `file_start`
[INFO] [stderr]   --> crates/core/src/storage/file_manager.rs:85:21
[INFO] [stderr]    |
[INFO] [stderr] 85 |             let (_, file_start, file_end) = self.file_offsets.iter()
[INFO] [stderr]    |                     ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_file_start`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `peer`
[INFO] [stderr]    --> crates/core/src/downloader.rs:285:13
[INFO] [stderr]     |
[INFO] [stderr] 285 |         for peer in peers.iter() {
[INFO] [stderr]     |             ^^^^ help: if this is intentional, prefix it with an underscore: `_peer`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `stream`
[INFO] [stderr]   --> crates/core/src/p2p_network.rs:57:25
[INFO] [stderr]    |
[INFO] [stderr] 57 |                     Ok((stream, addr)) => {
[INFO] [stderr]    |                         ^^^^^^ help: if this is intentional, prefix it with an underscore: `_stream`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `mgr`
[INFO] [stderr]   --> crates/core/src/p2p_network.rs:53:13
[INFO] [stderr]    |
[INFO] [stderr] 53 |         let mgr = self.clone();
[INFO] [stderr]    |             ^^^ help: if this is intentional, prefix it with an underscore: `_mgr`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `connection`
[INFO] [stderr]   --> crates/core/src/p2p_network.rs:71:43
[INFO] [stderr]    |
[INFO] [stderr] 71 |     async fn handle_new_connection(&self, connection: PeerConnection) {
[INFO] [stderr]    |                                           ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_connection`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `info_hash`
[INFO] [stderr]   --> crates/core/src/peer_discovery.rs:62:38
[INFO] [stderr]    |
[INFO] [stderr] 62 |     async fn discover_via_dht(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stderr]    |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `info_hash`
[INFO] [stderr]   --> crates/core/src/peer_discovery.rs:67:43
[INFO] [stderr]    |
[INFO] [stderr] 67 |     async fn discover_via_trackers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stderr]    |                                           ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `info_hash`
[INFO] [stderr]   --> crates/core/src/peer_discovery.rs:72:38
[INFO] [stderr]    |
[INFO] [stderr] 72 |     async fn discover_via_lsd(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stderr]    |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_info_hash`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `max_age`
[INFO] [stderr]   --> crates/core/src/peer_discovery.rs:89:37
[INFO] [stderr]    |
[INFO] [stderr] 89 |     pub async fn clear_stale(&self, max_age: std::time::Duration) {
[INFO] [stderr]    |                                     ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_max_age`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `torrents`
[INFO] [stderr]    --> crates/core/src/lib.rs:105:42
[INFO] [stderr]     |
[INFO] [stderr] 105 |     async fn load_state(config: &Config, torrents: &DashMap<String, TorrentHandle>) -> Result<()> {
[INFO] [stderr]     |                                          ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_torrents`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `download_path`
[INFO] [stderr]    --> crates/core/src/lib.rs:183:13
[INFO] [stderr]     |
[INFO] [stderr] 183 |         let download_path = self.config.paths.download_path.join(&name);
[INFO] [stderr]     |             ^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_download_path`
[INFO] [stderr] 
[INFO] [stderr] warning: type `NodeStats` is more private than the item `NodeManager::stats`
[INFO] [stderr]   --> crates/core/src/node_manager.rs:88:5
[INFO] [stderr]    |
[INFO] [stderr] 88 |     pub async fn stats(&self) -> NodeStats {
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `NodeManager::stats` is reachable at visibility `pub`
[INFO] [stderr]    |
[INFO] [stderr] note: but type `NodeStats` is only usable at visibility `pub(self)`
[INFO] [stderr]   --> crates/core/src/node_manager.rs:22:1
[INFO] [stderr]    |
[INFO] [stderr] 22 | struct NodeStats {
[INFO] [stderr]    | ^^^^^^^^^^^^^^^^
[INFO] [stderr]    = note: `#[warn(private_interfaces)]` on by default
[INFO] [stderr] 
[INFO] [stderr] warning: field `stats` is never read
[INFO] [stderr]   --> crates/core/src/lib.rs:43:5
[INFO] [stderr]    |
[INFO] [stderr] 37 | pub struct BitTorrentClient {
[INFO] [stderr]    |            ---------------- field in this struct
[INFO] [stderr] ...
[INFO] [stderr] 43 |     stats: Arc<RwLock<ClientStats>>,
[INFO] [stderr]    |     ^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `BitTorrentClient` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stderr]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: constant `ALPHABET` is never used
[INFO] [stderr]    --> crates/core/src/torrent.rs:309:11
[INFO] [stderr]     |
[INFO] [stderr] 309 |     const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
[INFO] [stderr]     |           ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: constant `ALPHABET` is never used
[INFO] [stderr]    --> crates/core/src/torrent.rs:313:11
[INFO] [stderr]     |
[INFO] [stderr] 313 |     const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
[INFO] [stderr]     |           ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: field `tx` is never read
[INFO] [stderr]   --> crates/core/src/dht/mod.rs:33:5
[INFO] [stderr]    |
[INFO] [stderr] 28 | pub struct DhtNode {
[INFO] [stderr]    |            ------- field in this struct
[INFO] [stderr] ...
[INFO] [stderr] 33 |     tx: mpsc::Sender<QueryMessage>,
[INFO] [stderr]    |     ^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `DhtNode` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: methods `remove_node`, `mark_failed`, `refresh_stale`, `size`, and `all_nodes` are never used
[INFO] [stderr]    --> crates/core/src/dht/routing_table.rs:115:12
[INFO] [stderr]     |
[INFO] [stderr]  29 | impl RoutingTable {
[INFO] [stderr]     | ----------------- methods in this implementation
[INFO] [stderr] ...
[INFO] [stderr] 115 |     pub fn remove_node(&mut self, node_id: &[u8; 20]) {
[INFO] [stderr]     |            ^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 126 |     pub fn mark_failed(&mut self, node_id: &[u8; 20]) {
[INFO] [stderr]     |            ^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 142 |     pub fn refresh_stale(&mut self) -> Vec<[u8; 20]> {
[INFO] [stderr]     |            ^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 170 |     pub fn size(&self) -> usize {
[INFO] [stderr]     |            ^^^^
[INFO] [stderr] ...
[INFO] [stderr] 174 |     pub fn all_nodes(&self) -> Vec<NodeInfo> {
[INFO] [stderr]     |            ^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: constant `QUERY_TIMEOUT` is never used
[INFO] [stderr]   --> crates/core/src/dht/query.rs:18:7
[INFO] [stderr]    |
[INFO] [stderr] 18 | const QUERY_TIMEOUT: Duration = Duration::from_secs(5);
[INFO] [stderr]    |       ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: constant `MAX_CONCURRENT_QUERIES` is never used
[INFO] [stderr]   --> crates/core/src/dht/query.rs:19:7
[INFO] [stderr]    |
[INFO] [stderr] 19 | const MAX_CONCURRENT_QUERIES: usize = 8;
[INFO] [stderr]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: multiple variants are never constructed
[INFO] [stderr]   --> crates/core/src/dht/query.rs:24:5
[INFO] [stderr]    |
[INFO] [stderr] 22 | pub enum QueryMessage {
[INFO] [stderr]    |          ------------ variants in this enum
[INFO] [stderr] 23 |     Ping { id: [u8; 20] },
[INFO] [stderr] 24 |     Pong { id: [u8; 20] },
[INFO] [stderr]    |     ^^^^
[INFO] [stderr] 25 |     FindNode { id: [u8; 20], target: [u8; 20] },
[INFO] [stderr]    |     ^^^^^^^^
[INFO] [stderr] 26 |     FindNodeResponse { id: [u8; 20], nodes: Vec<NodeInfo> },
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^
[INFO] [stderr] 27 |     GetPeers { id: [u8; 20], info_hash: [u8; 20] },
[INFO] [stderr] 28 |     GetPeersResponse { id: [u8; 20], token: [u8; 8], peers: Vec<PeerInfo>, nodes: Vec<NodeInfo> },
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^
[INFO] [stderr] 29 |     AnnouncePeer { id: [u8; 20], info_hash: [u8; 20], token: [u8; 8], port: u16 },
[INFO] [stderr]    |     ^^^^^^^^^^^^
[INFO] [stderr] 30 |     AnnouncePeerResponse { id: [u8; 20] },
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 31 |     Error { id: [u8; 20], message: String },
[INFO] [stderr]    |     ^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `QueryMessage` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: struct `QueryManager` is never constructed
[INFO] [stderr]   --> crates/core/src/dht/query.rs:48:12
[INFO] [stderr]    |
[INFO] [stderr] 48 | pub struct QueryManager {
[INFO] [stderr]    |            ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: multiple associated items are never used
[INFO] [stderr]    --> crates/core/src/dht/query.rs:55:12
[INFO] [stderr]     |
[INFO] [stderr]  54 | impl QueryManager {
[INFO] [stderr]     | ----------------- associated items in this implementation
[INFO] [stderr]  55 |     pub fn new(socket: Arc<UdpSocket>, routing_table: Arc<RwLock<RoutingTable>>) -> Self {
[INFO] [stderr]     |            ^^^
[INFO] [stderr] ...
[INFO] [stderr]  72 |     pub async fn ping(&self, addr: SocketAddr) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^
[INFO] [stderr] ...
[INFO] [stderr]  88 |     pub async fn find_node(&self, target: [u8; 20]) -> Result<Vec<NodeInfo>, Error> {
[INFO] [stderr]     |                  ^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 108 |     pub async fn get_peers(&self, info_hash: &[u8; 20]) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stderr]     |                  ^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 149 |     pub async fn announce_peer(&self, info_hash: &[u8; 20], port: u16) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 169 |     async fn query_node(&self, addr: SocketAddr, transaction_id: u32, msg: QueryMessage) -> Result<Vec<NodeInfo>, Error> {
[INFO] [stderr]     |              ^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 186 |     async fn query_peers(&self, addr: SocketAddr, transaction_id: u32, msg: QueryMessage) -> Result<(Vec<PeerInfo>, Vec<NodeInfo>),...
[INFO] [stderr]     |              ^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 200 |     async fn send_query(&self, transaction_id: u32, addr: SocketAddr, msg: QueryMessage) -> Result<(), Error> {
[INFO] [stderr]     |              ^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 209 |     async fn create_pending(&self, transaction_id: u32) -> mpsc::Receiver<QueryMessage> {
[INFO] [stderr]     |              ^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 215 |     async fn handle_responses(&self) {
[INFO] [stderr]     |              ^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: field `am_interested` is never read
[INFO] [stderr]    --> crates/core/src/peer/connection.rs:341:5
[INFO] [stderr]     |
[INFO] [stderr] 333 | pub struct PeerConnection {
[INFO] [stderr]     |            -------------- field in this struct
[INFO] [stderr] ...
[INFO] [stderr] 341 |     am_interested: bool,
[INFO] [stderr]     |     ^^^^^^^^^^^^^
[INFO] [stderr]     |
[INFO] [stderr]     = note: `PeerConnection` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: method `write_message` is never used
[INFO] [stderr]    --> crates/core/src/peer/connection.rs:532:14
[INFO] [stderr]     |
[INFO] [stderr] 347 | impl PeerConnection {
[INFO] [stderr]     | ------------------- method in this implementation
[INFO] [stderr] ...
[INFO] [stderr] 532 |     async fn write_message(&self, msg: PeerMessage) -> Result<(), Error> {
[INFO] [stderr]     |              ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: methods `has_extension` and `set_extension` are never used
[INFO] [stderr]    --> crates/core/src/peer/handshake.rs:94:12
[INFO] [stderr]     |
[INFO] [stderr]  17 | impl Handshake {
[INFO] [stderr]     | -------------- methods in this implementation
[INFO] [stderr] ...
[INFO] [stderr]  94 |     pub fn has_extension(&self, bit: usize) -> bool {
[INFO] [stderr]     |            ^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 104 |     pub fn set_extension(&mut self, bit: usize) {
[INFO] [stderr]     |            ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: constant `MAX_MESSAGE_SIZE` is never used
[INFO] [stderr]    --> crates/core/src/peer/peer_wire.rs:100:7
[INFO] [stderr]     |
[INFO] [stderr] 100 | const MAX_MESSAGE_SIZE: usize = 16 * 1024 * 1024; // 16MB
[INFO] [stderr]     |       ^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: constant `READ_TIMEOUT` is never used
[INFO] [stderr]    --> crates/core/src/peer/peer_wire.rs:101:7
[INFO] [stderr]     |
[INFO] [stderr] 101 | const READ_TIMEOUT: Duration = Duration::from_secs(30);
[INFO] [stderr]     |       ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: constant `WRITE_TIMEOUT` is never used
[INFO] [stderr]    --> crates/core/src/peer/peer_wire.rs:102:7
[INFO] [stderr]     |
[INFO] [stderr] 102 | const WRITE_TIMEOUT: Duration = Duration::from_secs(30);
[INFO] [stderr]     |       ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `PeerWire` is never constructed
[INFO] [stderr]    --> crates/core/src/peer/peer_wire.rs:104:12
[INFO] [stderr]     |
[INFO] [stderr] 104 | pub struct PeerWire {
[INFO] [stderr]     |            ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: associated items `new`, `read_message`, `write_message`, and `close` are never used
[INFO] [stderr]    --> crates/core/src/peer/peer_wire.rs:110:12
[INFO] [stderr]     |
[INFO] [stderr] 109 | impl PeerWire {
[INFO] [stderr]     | ------------- associated items in this implementation
[INFO] [stderr] 110 |     pub fn new(stream: TcpStream) -> Self {
[INFO] [stderr]     |            ^^^
[INFO] [stderr] ...
[INFO] [stderr] 117 |     pub async fn read_message(&mut self) -> Result<Option<PeerMessage>, Error> {
[INFO] [stderr]     |                  ^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 164 |     pub async fn write_message(&mut self, message: &PeerMessage) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 173 |     pub async fn close(&mut self) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `Block` is never constructed
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:19:12
[INFO] [stderr]    |
[INFO] [stderr] 19 | pub struct Block {
[INFO] [stderr]    |            ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: associated items `new`, `with_data`, and `is_complete` are never used
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:27:12
[INFO] [stderr]    |
[INFO] [stderr] 26 | impl Block {
[INFO] [stderr]    | ---------- associated items in this implementation
[INFO] [stderr] 27 |     pub fn new(piece_index: u32, offset: u32, length: u32) -> Self {
[INFO] [stderr]    |            ^^^
[INFO] [stderr] ...
[INFO] [stderr] 36 |     pub fn with_data(piece_index: u32, offset: u32, data: Vec<u8>) -> Self {
[INFO] [stderr]    |            ^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 46 |     pub fn is_complete(&self) -> bool {
[INFO] [stderr]    |            ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: enum `PieceState` is never used
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:53:10
[INFO] [stderr]    |
[INFO] [stderr] 53 | pub enum PieceState {
[INFO] [stderr]    |          ^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `PiecesConfig` is never constructed
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:63:12
[INFO] [stderr]    |
[INFO] [stderr] 63 | pub struct PiecesConfig {
[INFO] [stderr]    |            ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `PiecesStats` is never constructed
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:83:12
[INFO] [stderr]    |
[INFO] [stderr] 83 | pub struct PiecesStats {
[INFO] [stderr]    |            ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: trait `PieceSelectionStrategy` is never used
[INFO] [stderr]   --> crates/core/src/pieces/mod.rs:95:11
[INFO] [stderr]    |
[INFO] [stderr] 95 | pub trait PieceSelectionStrategy: Send + Sync {
[INFO] [stderr]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `RarestFirstStrategy` is never constructed
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:107:12
[INFO] [stderr]     |
[INFO] [stderr] 107 | pub struct RarestFirstStrategy;
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `RandomFirstStrategy` is never constructed
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:127:12
[INFO] [stderr]     |
[INFO] [stderr] 127 | pub struct RandomFirstStrategy;
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `SequentialStrategy` is never constructed
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:154:12
[INFO] [stderr]     |
[INFO] [stderr] 154 | pub struct SequentialStrategy;
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `EndgameStrategy` is never constructed
[INFO] [stderr]    --> crates/core/src/pieces/mod.rs:178:12
[INFO] [stderr]     |
[INFO] [stderr] 178 | pub struct EndgameStrategy;
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: field `index` is never read
[INFO] [stderr]   --> crates/core/src/pieces/piece_manager.rs:15:9
[INFO] [stderr]    |
[INFO] [stderr] 14 | pub struct PieceInfo {
[INFO] [stderr]    |            --------- field in this struct
[INFO] [stderr] 15 |     pub index: u32,
[INFO] [stderr]    |         ^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `PieceInfo` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: fields `total_size` and `uploaded` are never read
[INFO] [stderr]   --> crates/core/src/pieces/piece_manager.rs:26:5
[INFO] [stderr]    |
[INFO] [stderr] 23 | pub struct PieceManager {
[INFO] [stderr]    |            ------------ fields in this struct
[INFO] [stderr] ...
[INFO] [stderr] 26 |     total_size: u64,
[INFO] [stderr]    |     ^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 31 |     uploaded: u64,
[INFO] [stderr]    |     ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: fields `piece_index`, `offset`, and `data` are never read
[INFO] [stderr]   --> crates/core/src/pieces/piece_manager.rs:37:5
[INFO] [stderr]    |
[INFO] [stderr] 36 | struct PieceWrite {
[INFO] [stderr]    |        ---------- fields in this struct
[INFO] [stderr] 37 |     piece_index: u32,
[INFO] [stderr]    |     ^^^^^^^^^^^
[INFO] [stderr] 38 |     offset: u32,
[INFO] [stderr]    |     ^^^^^^
[INFO] [stderr] 39 |     data: Vec<u8>,
[INFO] [stderr]    |     ^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: fields `peer_interested` and `priority_pieces` are never read
[INFO] [stderr]   --> crates/core/src/pieces/piece_picker.rs:11:5
[INFO] [stderr]    |
[INFO] [stderr]  8 | pub struct PiecePicker {
[INFO] [stderr]    |            ----------- fields in this struct
[INFO] [stderr] ...
[INFO] [stderr] 11 |     peer_interested: BitVec,
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^
[INFO] [stderr] 12 |     partial_pieces: HashMap<u32, PartialPiece>,
[INFO] [stderr] 13 |     priority_pieces: Vec<u32>,
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `PiecePicker` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: fields `index` and `last_request` are never read
[INFO] [stderr]   --> crates/core/src/pieces/piece_picker.rs:19:5
[INFO] [stderr]    |
[INFO] [stderr] 18 | struct PartialPiece {
[INFO] [stderr]    |        ------------ fields in this struct
[INFO] [stderr] 19 |     index: u32,
[INFO] [stderr]    |     ^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 22 |     last_request: std::time::Instant,
[INFO] [stderr]    |     ^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `PartialPiece` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: variants `RandomFirst`, `EndGame`, and `Sequential` are never constructed
[INFO] [stderr]   --> crates/core/src/pieces/piece_picker.rs:28:5
[INFO] [stderr]    |
[INFO] [stderr] 26 | pub enum SelectionMode {
[INFO] [stderr]    |          ------------- variants in this enum
[INFO] [stderr] 27 |     RarestFirst,
[INFO] [stderr] 28 |     RandomFirst,
[INFO] [stderr]    |     ^^^^^^^^^^^
[INFO] [stderr] 29 |     EndGame,
[INFO] [stderr]    |     ^^^^^^^
[INFO] [stderr] 30 |     Sequential,
[INFO] [stderr]    |     ^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `SelectionMode` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: multiple methods are never used
[INFO] [stderr]    --> crates/core/src/pieces/piece_picker.rs:45:12
[INFO] [stderr]     |
[INFO] [stderr]  33 | impl PiecePicker {
[INFO] [stderr]     | ---------------- methods in this implementation
[INFO] [stderr] ...
[INFO] [stderr]  45 |     pub fn update_have_pieces(&mut self, bitfield: &BitVec) {
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  49 |     pub fn update_peer_interested(&mut self, bitfield: &BitVec) {
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  53 |     pub fn add_partial_piece(&mut self, index: u32, block_count: usize) {
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  62 |     pub fn mark_block_requested(&mut self, piece_index: u32, block_index: usize) {
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  69 |     pub fn mark_block_downloaded(&mut self, piece_index: u32, block_index: usize) {
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  76 |     pub fn piece_completed(&mut self, piece_index: u32) {
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 145 |     pub fn cancel_stale_requests(&mut self, timeout: std::time::Duration) -> Vec<(u32, usize)> {
[INFO] [stderr]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `HashChecker` is never constructed
[INFO] [stderr]  --> crates/core/src/pieces/hash_checker.rs:8:12
[INFO] [stderr]   |
[INFO] [stderr] 8 | pub struct HashChecker;
[INFO] [stderr]   |            ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: associated items `new`, `verify_piece`, `verify_pieces`, and `verify_piece_range` are never used
[INFO] [stderr]   --> crates/core/src/pieces/hash_checker.rs:11:12
[INFO] [stderr]    |
[INFO] [stderr] 10 | impl HashChecker {
[INFO] [stderr]    | ---------------- associated items in this implementation
[INFO] [stderr] 11 |     pub fn new() -> Self {
[INFO] [stderr]    |            ^^^
[INFO] [stderr] ...
[INFO] [stderr] 15 |     pub async fn verify_piece(
[INFO] [stderr]    |                  ^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 31 |     pub async fn verify_pieces(
[INFO] [stderr]    |                  ^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 55 |     pub async fn verify_piece_range(
[INFO] [stderr]    |                  ^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `DiskWriter` is never constructed
[INFO] [stderr]   --> crates/core/src/storage/disk_writer.rs:11:12
[INFO] [stderr]    |
[INFO] [stderr] 11 | pub struct DiskWriter {
[INFO] [stderr]    |            ^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `WriteOperation` is never constructed
[INFO] [stderr]   --> crates/core/src/storage/disk_writer.rs:17:8
[INFO] [stderr]    |
[INFO] [stderr] 17 | struct WriteOperation {
[INFO] [stderr]    |        ^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: associated items `new`, `write`, `write_batch`, `flush`, and `close` are never used
[INFO] [stderr]    --> crates/core/src/storage/disk_writer.rs:24:18
[INFO] [stderr]     |
[INFO] [stderr]  23 | impl DiskWriter {
[INFO] [stderr]     | --------------- associated items in this implementation
[INFO] [stderr]  24 |     pub async fn new(file_path: PathBuf) -> Result<Self, Error> {
[INFO] [stderr]     |                  ^^^
[INFO] [stderr] ...
[INFO] [stderr] 106 |     pub async fn write(&self, offset: u64, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 118 |     pub async fn write_batch(&self, writes: Vec<(u64, Vec<u8>)>) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 125 |     pub async fn flush(&self) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 133 |     pub async fn close(&self) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `MemoryCache` is never constructed
[INFO] [stderr]  --> crates/core/src/storage/memory_cache.rs:8:12
[INFO] [stderr]   |
[INFO] [stderr] 8 | pub struct MemoryCache {
[INFO] [stderr]   |            ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `CacheKey` is never constructed
[INFO] [stderr]   --> crates/core/src/storage/memory_cache.rs:15:8
[INFO] [stderr]    |
[INFO] [stderr] 15 | struct CacheKey {
[INFO] [stderr]    |        ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `CacheEntry` is never constructed
[INFO] [stderr]   --> crates/core/src/storage/memory_cache.rs:21:8
[INFO] [stderr]    |
[INFO] [stderr] 21 | struct CacheEntry {
[INFO] [stderr]    |        ^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: associated items `new`, `get`, `put`, `get_piece_blocks`, `clear`, and `size` are never used
[INFO] [stderr]   --> crates/core/src/storage/memory_cache.rs:27:12
[INFO] [stderr]    |
[INFO] [stderr] 26 | impl MemoryCache {
[INFO] [stderr]    | ---------------- associated items in this implementation
[INFO] [stderr] 27 |     pub fn new(max_size_mb: usize) -> Self {
[INFO] [stderr]    |            ^^^
[INFO] [stderr] ...
[INFO] [stderr] 39 |     pub async fn get(&self, piece_index: u32, block_offset: u32) -> Option<Vec<u8>> {
[INFO] [stderr]    |                  ^^^
[INFO] [stderr] ...
[INFO] [stderr] 50 |     pub async fn put(&self, piece_index: u32, block_offset: u32, data: Vec<u8>) {
[INFO] [stderr]    |                  ^^^
[INFO] [stderr] ...
[INFO] [stderr] 72 |     pub async fn get_piece_blocks(&self, piece_index: u32) -> Vec<(u32, Vec<u8>)> {
[INFO] [stderr]    |                  ^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 85 |     pub async fn clear(&self) {
[INFO] [stderr]    |                  ^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 91 |     pub async fn size(&self) -> usize {
[INFO] [stderr]    |                  ^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `FileManager` is never constructed
[INFO] [stderr]   --> crates/core/src/storage/file_manager.rs:11:12
[INFO] [stderr]    |
[INFO] [stderr] 11 | pub struct FileManager {
[INFO] [stderr]    |            ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: multiple associated items are never used
[INFO] [stderr]    --> crates/core/src/storage/file_manager.rs:19:12
[INFO] [stderr]     |
[INFO] [stderr]  18 | impl FileManager {
[INFO] [stderr]     | ---------------- associated items in this implementation
[INFO] [stderr]  19 |     pub fn new(base_path: PathBuf, files: Vec<TorrentFile>) -> Result<Self, Error> {
[INFO] [stderr]     |            ^^^
[INFO] [stderr] ...
[INFO] [stderr]  40 |     pub async fn write(&self, offset: u64, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  49 |     pub async fn write_piece(&self, piece_index: u32, piece_length: u32, data: Vec<u8>) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  76 |     pub async fn read(&self, offset: u64, length: u64) -> Result<Vec<u8>, Error> {
[INFO] [stderr]     |                  ^^^^
[INFO] [stderr] ...
[INFO] [stderr] 102 |     pub async fn flush_all(&self) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 110 |     pub async fn close_all(&self) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 118 |     async fn get_writer(&self, file_path: &Path) -> Result<Arc<DiskWriter>, Error> {
[INFO] [stderr]     |              ^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 135 |     fn resolve_offset(&self, offset: u64) -> Result<(PathBuf, u64), Error> {
[INFO] [stderr]     |        ^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 146 |     pub fn total_size(&self) -> u64 {
[INFO] [stderr]     |            ^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: fields `downloaded_bytes`, `uploaded_bytes`, `download_rate`, and `upload_rate` are never read
[INFO] [stderr]   --> crates/core/src/downloader.rs:30:5
[INFO] [stderr]    |
[INFO] [stderr] 29 | struct DownloadStats {
[INFO] [stderr]    |        ------------- fields in this struct
[INFO] [stderr] 30 |     downloaded_bytes: u64,
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^
[INFO] [stderr] 31 |     uploaded_bytes: u64,
[INFO] [stderr]    |     ^^^^^^^^^^^^^^
[INFO] [stderr] 32 |     download_rate: f64,
[INFO] [stderr]    |     ^^^^^^^^^^^^^
[INFO] [stderr] 33 |     upload_rate: f64,
[INFO] [stderr]    |     ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: fields `peer`, `block_offset`, and `block_length` are never read
[INFO] [stderr]   --> crates/core/src/uploader.rs:63:5
[INFO] [stderr]    |
[INFO] [stderr] 62 | struct UploadRequest {
[INFO] [stderr]    |        ------------- fields in this struct
[INFO] [stderr] 63 |     peer: Arc<PeerConnection>,
[INFO] [stderr]    |     ^^^^
[INFO] [stderr] 64 |     piece_index: u32,
[INFO] [stderr] 65 |     block_offset: u32,
[INFO] [stderr]    |     ^^^^^^^^^^^^
[INFO] [stderr] 66 |     block_length: u32,
[INFO] [stderr]    |     ^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `UploadRequest` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: field `config` is never read
[INFO] [stderr]   --> crates/core/src/seeding.rs:13:5
[INFO] [stderr]    |
[INFO] [stderr] 10 | pub struct Seeder {
[INFO] [stderr]    |            ------ field in this struct
[INFO] [stderr] ...
[INFO] [stderr] 13 |     config: Arc<Config>,
[INFO] [stderr]    |     ^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `NatTraversal` is never constructed
[INFO] [stderr]  --> crates/core/src/nat_traversal.rs:7:12
[INFO] [stderr]   |
[INFO] [stderr] 7 | pub struct NatTraversal;
[INFO] [stderr]   |            ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: multiple associated items are never used
[INFO] [stderr]    --> crates/core/src/nat_traversal.rs:10:12
[INFO] [stderr]     |
[INFO] [stderr]   9 | impl NatTraversal {
[INFO] [stderr]     | ----------------- associated items in this implementation
[INFO] [stderr]  10 |     pub fn new() -> Self {
[INFO] [stderr]     |            ^^^
[INFO] [stderr] ...
[INFO] [stderr]  14 |     pub async fn get_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stderr]     |                  ^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  33 |     async fn get_upnp_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stderr]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  53 |     async fn get_stun_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stderr]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  58 |     async fn get_http_external_ip(&self) -> Result<IpAddr, Error> {
[INFO] [stderr]     |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr]  71 |     pub async fn add_port_mapping(
[INFO] [stderr]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 118 |     pub async fn remove_port_mapping(&self, external_port: u16, protocol: Protocol) -> Result<(), Error> {
[INFO] [stderr]     |                  ^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: enum `Protocol` is never used
[INFO] [stderr]    --> crates/core/src/nat_traversal.rs:137:10
[INFO] [stderr]     |
[INFO] [stderr] 137 | pub enum Protocol {
[INFO] [stderr]     |          ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `PeerDiscovery` is never constructed
[INFO] [stderr]   --> crates/core/src/peer_discovery.rs:11:12
[INFO] [stderr]    |
[INFO] [stderr] 11 | pub struct PeerDiscovery {
[INFO] [stderr]    |            ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: enum `DiscoveryMethod` is never used
[INFO] [stderr]   --> crates/core/src/peer_discovery.rs:16:6
[INFO] [stderr]    |
[INFO] [stderr] 16 | enum DiscoveryMethod {
[INFO] [stderr]    |      ^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: multiple associated items are never used
[INFO] [stderr]   --> crates/core/src/peer_discovery.rs:24:12
[INFO] [stderr]    |
[INFO] [stderr] 23 | impl PeerDiscovery {
[INFO] [stderr]    | ------------------ associated items in this implementation
[INFO] [stderr] 24 |     pub fn new() -> Self {
[INFO] [stderr]    |            ^^^
[INFO] [stderr] ...
[INFO] [stderr] 31 |     pub async fn discover_peers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stderr]    |                  ^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 62 |     async fn discover_via_dht(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stderr]    |              ^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 67 |     async fn discover_via_trackers(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stderr]    |              ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 72 |     async fn discover_via_lsd(&self, info_hash: &InfoHash) -> Result<Vec<PeerInfo>, Error> {
[INFO] [stderr]    |              ^^^^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 77 |     pub async fn add_peer(&self, addr: SocketAddr) {
[INFO] [stderr]    |                  ^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 81 |     pub async fn remove_peer(&self, addr: &SocketAddr) {
[INFO] [stderr]    |                  ^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 85 |     pub async fn known_peers(&self) -> Vec<SocketAddr> {
[INFO] [stderr]    |                  ^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 89 |     pub async fn clear_stale(&self, max_age: std::time::Duration) {
[INFO] [stderr]    |                  ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: field `active_connections` is never read
[INFO] [stderr]   --> crates/core/src/node_manager.rs:24:5
[INFO] [stderr]    |
[INFO] [stderr] 22 | struct NodeStats {
[INFO] [stderr]    |        --------- field in this struct
[INFO] [stderr] 23 |     total_peers_discovered: u64,
[INFO] [stderr] 24 |     active_connections: usize,
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `NodeStats` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stderr] 
[INFO] [stderr] warning: unused `std::result::Result` that must be used
[INFO] [stderr]   --> crates/core/src/seeding.rs:39:9
[INFO] [stderr]    |
[INFO] [stderr] 39 |         self.uploader.start().await;
[INFO] [stderr]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stderr]    = note: `#[warn(unused_must_use)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] help: use `let _ = ...` to ignore the resulting value
[INFO] [stderr]    |
[INFO] [stderr] 39 |         let _ = self.uploader.start().await;
[INFO] [stderr]    |         +++++++
[INFO] [stderr] 
[INFO] [stderr] warning: unused `std::result::Result` that must be used
[INFO] [stderr]   --> crates/core/src/seeding.rs:56:9
[INFO] [stderr]    |
[INFO] [stderr] 56 |         self.uploader.stop().await;
[INFO] [stderr]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stderr] help: use `let _ = ...` to ignore the resulting value
[INFO] [stderr]    |
[INFO] [stderr] 56 |         let _ = self.uploader.stop().await;
[INFO] [stderr]    |         +++++++
[INFO] [stderr] 
[INFO] [stderr] warning: unused `std::result::Result` that must be used
[INFO] [stderr]   --> crates/core/src/seeding.rs:62:9
[INFO] [stderr]    |
[INFO] [stderr] 62 |         self.uploader.add_peer(peer).await;
[INFO] [stderr]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stderr] help: use `let _ = ...` to ignore the resulting value
[INFO] [stderr]    |
[INFO] [stderr] 62 |         let _ = self.uploader.add_peer(peer).await;
[INFO] [stderr]    |         +++++++
[INFO] [stderr] 
[INFO] [stderr] warning: unused `std::result::Result` that must be used
[INFO] [stderr]   --> crates/core/src/seeding.rs:66:9
[INFO] [stderr]    |
[INFO] [stderr] 66 |         self.uploader.remove_peer(peer).await;
[INFO] [stderr]    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: this `Result` may be an `Err` variant, which should be handled
[INFO] [stderr] help: use `let _ = ...` to ignore the resulting value
[INFO] [stderr]    |
[INFO] [stderr] 66 |         let _ = self.uploader.remove_peer(peer).await;
[INFO] [stderr]    |         +++++++
[INFO] [stderr] 
[INFO] [stderr] warning: `core` (lib) generated 137 warnings (run `cargo fix --lib -p core` to apply 75 suggestions)
[INFO] [stderr] warning: unused imports: `IntoResponse` and `body::Body`
[INFO] [stderr]  --> crates/api/src/routes/files.rs:5:5
[INFO] [stderr]   |
[INFO] [stderr] 5 |     body::Body,
[INFO] [stderr]   |     ^^^^^^^^^^
[INFO] [stderr] 6 |     response::{Response, IntoResponse},
[INFO] [stderr]   |                          ^^^^^^^^^^^^
[INFO] [stderr]   |
[INFO] [stderr]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: use of deprecated function `base64::decode`: Use Engine::decode
[INFO] [stderr]   --> crates/api/src/routes/torrents.rs:71:32
[INFO] [stderr]    |
[INFO] [stderr] 71 |     let torrent_data = base64::decode(&req.torrent_file)
[INFO] [stderr]    |                                ^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `#[warn(deprecated)]` on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `path`
[INFO] [stderr]   --> crates/api/src/routes/files.rs:42:10
[INFO] [stderr]    |
[INFO] [stderr] 42 |     Path(path): Path<String>,
[INFO] [stderr]    |          ^^^^ help: if this is intentional, prefix it with an underscore: `_path`
[INFO] [stderr]    |
[INFO] [stderr]    = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `state`
[INFO] [stderr]   --> crates/api/src/websocket.rs:23:43
[INFO] [stderr]    |
[INFO] [stderr] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stderr]    |                                           ^^^^^ help: if this is intentional, prefix it with an underscore: `_state`
[INFO] [stderr] 
[INFO] [stderr] warning: unused variable: `tx`
[INFO] [stderr]   --> crates/api/src/websocket.rs:27:10
[INFO] [stderr]    |
[INFO] [stderr] 27 |     let (tx, mut rx) = broadcast::channel(32);
[INFO] [stderr]    |          ^^ help: if this is intentional, prefix it with an underscore: `_tx`
[INFO] [stderr] 
[INFO] [stderr] warning: `api` (lib) generated 5 warnings (run `cargo fix --lib -p api` to apply 4 suggestions)
[INFO] [stderr] warning: unused import: `std::path::Path`
[INFO] [stderr]  --> crates/cli/src/commands.rs:7:5
[INFO] [stderr]   |
[INFO] [stderr] 7 | use std::path::Path;
[INFO] [stderr]   |     ^^^^^^^^^^^^^^^
[INFO] [stderr]   |
[INFO] [stderr]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `Gauge`
[INFO] [stderr]   --> crates/cli/src/ui.rs:12:60
[INFO] [stderr]    |
[INFO] [stderr] 12 |     widgets::{Block, Borders, Cell, Row, Table, Paragraph, Gauge},
[INFO] [stderr]    |                                                            ^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `tracing::info`
[INFO] [stderr]  --> crates/cli/src/main.rs:8:5
[INFO] [stderr]   |
[INFO] [stderr] 8 | use tracing::info;
[INFO] [stderr]   |     ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: use of deprecated function `base64::encode`: Use Engine::encode
[INFO] [stderr]   --> crates/cli/src/commands.rs:18:27
[INFO] [stderr]    |
[INFO] [stderr] 18 |     let encoded = base64::encode(&data);
[INFO] [stderr]    |                           ^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `#[warn(deprecated)]` on by default
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `Backend`
[INFO] [stderr]   --> crates/cli/src/ui.rs:10:15
[INFO] [stderr]    |
[INFO] [stderr] 10 |     backend::{Backend, CrosstermBackend},
[INFO] [stderr]    |               ^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `TuiApp` is never constructed
[INFO] [stderr]   --> crates/cli/src/ui.rs:21:12
[INFO] [stderr]    |
[INFO] [stderr] 21 | pub struct TuiApp {
[INFO] [stderr]    |            ^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: struct `TorrentInfo` is never constructed
[INFO] [stderr]   --> crates/cli/src/ui.rs:27:8
[INFO] [stderr]    |
[INFO] [stderr] 27 | struct TorrentInfo {
[INFO] [stderr]    |        ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: associated items `new`, `run`, `draw`, `draw_torrents`, `handle_events`, and `update_torrents` are never used
[INFO] [stderr]    --> crates/cli/src/ui.rs:36:12
[INFO] [stderr]     |
[INFO] [stderr]  35 | impl TuiApp {
[INFO] [stderr]     | ----------- associated items in this implementation
[INFO] [stderr]  36 |     pub fn new() -> Self {
[INFO] [stderr]     |            ^^^
[INFO] [stderr] ...
[INFO] [stderr]  45 |     pub async fn run(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stderr]     |                  ^^^
[INFO] [stderr] ...
[INFO] [stderr]  80 |     fn draw(&mut self, f: &mut Frame<'_>) {
[INFO] [stderr]     |        ^^^^
[INFO] [stderr] ...
[INFO] [stderr] 108 |     fn draw_torrents(&self, f: &mut Frame<'_>, area: Rect) {
[INFO] [stderr]     |        ^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 151 |     fn handle_events(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stderr]     |        ^^^^^^^^^^^^^
[INFO] [stderr] ...
[INFO] [stderr] 169 |     async fn update_torrents(&mut self) -> Result<(), Box<dyn std::error::Error>> {
[INFO] [stderr]     |              ^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `TorrentData` is never constructed
[INFO] [stderr]    --> crates/cli/src/ui.rs:188:8
[INFO] [stderr]     |
[INFO] [stderr] 188 | struct TorrentData {
[INFO] [stderr]     |        ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused imports: `Router`, `delete`, `get`, `http::Method`, and `post`
[INFO] [stderr]   --> crates/api/src/main.rs:11:5
[INFO] [stderr]    |
[INFO] [stderr] 11 |     Router,
[INFO] [stderr]    |     ^^^^^^
[INFO] [stderr] 12 |     routing::{get, post, delete},
[INFO] [stderr]    |               ^^^  ^^^^  ^^^^^^
[INFO] [stderr] 13 |     http::Method,
[INFO] [stderr]    |     ^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused imports: `Any` and `CorsLayer`
[INFO] [stderr]   --> crates/api/src/main.rs:15:24
[INFO] [stderr]    |
[INFO] [stderr] 15 | use tower_http::cors::{CorsLayer, Any};
[INFO] [stderr]    |                        ^^^^^^^^^  ^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `std::future`
[INFO] [stderr]   --> crates/api/src/main.rs:17:5
[INFO] [stderr]    |
[INFO] [stderr] 17 | use std::future;
[INFO] [stderr]    |     ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: unused import: `tokio::sync::broadcast`
[INFO] [stderr]   --> crates/api/src/main.rs:18:5
[INFO] [stderr]    |
[INFO] [stderr] 18 | use tokio::sync::broadcast;
[INFO] [stderr]    |     ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `shutdown_signal` is never used
[INFO] [stderr]   --> crates/api/src/main.rs:56:10
[INFO] [stderr]    |
[INFO] [stderr] 56 | async fn shutdown_signal() {
[INFO] [stderr]    |          ^^^^^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stderr] 
[INFO] [stderr] warning: struct `AddTorrentRequest` is never constructed
[INFO] [stderr]   --> crates/api/src/routes/torrents.rs:13:12
[INFO] [stderr]    |
[INFO] [stderr] 13 | pub struct AddTorrentRequest {
[INFO] [stderr]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `AddMagnetRequest` is never constructed
[INFO] [stderr]   --> crates/api/src/routes/torrents.rs:18:12
[INFO] [stderr]    |
[INFO] [stderr] 18 | pub struct AddMagnetRequest {
[INFO] [stderr]    |            ^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `RemoveTorrentRequest` is never constructed
[INFO] [stderr]   --> crates/api/src/routes/torrents.rs:23:12
[INFO] [stderr]    |
[INFO] [stderr] 23 | pub struct RemoveTorrentRequest {
[INFO] [stderr]    |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `TorrentResponse` is never constructed
[INFO] [stderr]   --> crates/api/src/routes/torrents.rs:28:12
[INFO] [stderr]    |
[INFO] [stderr] 28 | pub struct TorrentResponse {
[INFO] [stderr]    |            ^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `list_torrents` is never used
[INFO] [stderr]   --> crates/api/src/routes/torrents.rs:43:14
[INFO] [stderr]    |
[INFO] [stderr] 43 | pub async fn list_torrents(
[INFO] [stderr]    |              ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `add_torrent` is never used
[INFO] [stderr]   --> crates/api/src/routes/torrents.rs:66:14
[INFO] [stderr]    |
[INFO] [stderr] 66 | pub async fn add_torrent(
[INFO] [stderr]    |              ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `add_magnet` is never used
[INFO] [stderr]   --> crates/api/src/routes/torrents.rs:98:14
[INFO] [stderr]    |
[INFO] [stderr] 98 | pub async fn add_magnet(
[INFO] [stderr]    |              ^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `get_torrent` is never used
[INFO] [stderr]    --> crates/api/src/routes/torrents.rs:125:14
[INFO] [stderr]     |
[INFO] [stderr] 125 | pub async fn get_torrent(
[INFO] [stderr]     |              ^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `remove_torrent` is never used
[INFO] [stderr]    --> crates/api/src/routes/torrents.rs:149:14
[INFO] [stderr]     |
[INFO] [stderr] 149 | pub async fn remove_torrent(
[INFO] [stderr]     |              ^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `pause_torrent` is never used
[INFO] [stderr]    --> crates/api/src/routes/torrents.rs:160:14
[INFO] [stderr]     |
[INFO] [stderr] 160 | pub async fn pause_torrent(
[INFO] [stderr]     |              ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `resume_torrent` is never used
[INFO] [stderr]    --> crates/api/src/routes/torrents.rs:170:14
[INFO] [stderr]     |
[INFO] [stderr] 170 | pub async fn resume_torrent(
[INFO] [stderr]     |              ^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `StatsResponse` is never constructed
[INFO] [stderr]  --> crates/api/src/routes/stats.rs:9:12
[INFO] [stderr]   |
[INFO] [stderr] 9 | pub struct StatsResponse {
[INFO] [stderr]   |            ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `get_stats` is never used
[INFO] [stderr]   --> crates/api/src/routes/stats.rs:19:14
[INFO] [stderr]    |
[INFO] [stderr] 19 | pub async fn get_stats(
[INFO] [stderr]    |              ^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `list_files` is never used
[INFO] [stderr]   --> crates/api/src/routes/files.rs:13:14
[INFO] [stderr]    |
[INFO] [stderr] 13 | pub async fn list_files(
[INFO] [stderr]    |              ^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `get_file` is never used
[INFO] [stderr]   --> crates/api/src/routes/files.rs:41:14
[INFO] [stderr]    |
[INFO] [stderr] 41 | pub async fn get_file(
[INFO] [stderr]    |              ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `FileInfo` is never constructed
[INFO] [stderr]   --> crates/api/src/routes/files.rs:50:12
[INFO] [stderr]    |
[INFO] [stderr] 50 | pub struct FileInfo {
[INFO] [stderr]    |            ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `websocket_handler` is never used
[INFO] [stderr]   --> crates/api/src/websocket.rs:16:14
[INFO] [stderr]    |
[INFO] [stderr] 16 | pub async fn websocket_handler(
[INFO] [stderr]    |              ^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `handle_socket` is never used
[INFO] [stderr]   --> crates/api/src/websocket.rs:23:10
[INFO] [stderr]    |
[INFO] [stderr] 23 | async fn handle_socket(socket: WebSocket, state: Arc<AppState>) {
[INFO] [stderr]    |          ^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `logging_middleware` is never used
[INFO] [stderr]   --> crates/api/src/middleware.rs:14:14
[INFO] [stderr]    |
[INFO] [stderr] 14 | pub async fn logging_middleware(
[INFO] [stderr]    |              ^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `auth_middleware` is never used
[INFO] [stderr]   --> crates/api/src/middleware.rs:30:14
[INFO] [stderr]    |
[INFO] [stderr] 30 | pub async fn auth_middleware(
[INFO] [stderr]    |              ^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `validate_token` is never used
[INFO] [stderr]   --> crates/api/src/middleware.rs:59:4
[INFO] [stderr]    |
[INFO] [stderr] 59 | fn validate_token(_token: &str, _secret: &str) -> bool {
[INFO] [stderr]    |    ^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: function `cors_middleware` is never used
[INFO] [stderr]   --> crates/api/src/middleware.rs:64:14
[INFO] [stderr]    |
[INFO] [stderr] 64 | pub async fn cors_middleware(
[INFO] [stderr]    |              ^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: struct `AppState` is never constructed
[INFO] [stderr]  --> crates/api/src/state.rs:8:12
[INFO] [stderr]   |
[INFO] [stderr] 8 | pub struct AppState {
[INFO] [stderr]   |            ^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] warning: `cli` (bin "torrent-cli" test) generated 9 warnings (run `cargo fix --bin "torrent-cli" -p cli --tests` to apply 3 suggestions)
[INFO] [stderr] warning: `api` (bin "api" test) generated 33 warnings (5 duplicates) (run `cargo fix --bin "api" -p api --tests` to apply 4 suggestions)
[INFO] [stderr] warning: `api` (lib test) generated 5 warnings (5 duplicates)
[INFO] [stderr] warning: `core` (lib test) generated 136 warnings (136 duplicates)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.94s
[INFO] [stderr] warning: the following packages contain code that will be rejected by a future version of Rust: proc-macro-error2 v2.0.1
[INFO] [stderr] note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/api-a557be99b6da13fa)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/api-f2e4d451b454b2fe)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/torrent_cli-178d7a61084a4ee8)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/common-7869717bb5b67718)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/core-c194d8ba34b6c490)
[INFO] [stdout] 
[INFO] [stdout] running 5 tests
[INFO] [stdout] test bencode::tests::test_encode_decode_list ... ok
[INFO] [stdout] test bencode::tests::test_encode_decode_integer ... ok
[INFO] [stdout] test peer::handshake::tests::test_handshake_roundtrip ... ok
[INFO] [stdout] test peer::handshake::tests::test_extension_bits ... ok
[INFO] [stdout] test bencode::tests::test_encode_decode_string ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/torrent_node-802c6ed3a13f6f8b)
[INFO] [stderr]    Doc-tests api
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests common
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests core
[INFO] [stderr] error[E0433]: cannot find `write` in `core`
[INFO] [stderr]  --> crates/core/src/error.rs:6:10
[INFO] [stderr]   |
[INFO] [stderr] 6 | #[derive(Error, Debug)]
[INFO] [stderr]   |          ^^^^^ could not find `write` in `core`
[INFO] [stderr]   |
[INFO] [stderr]   = note: this error originates in the derive macro `Error` (in Nightly builds, run with -Z macro-backtrace for more info)
[INFO] [stderr] 
[INFO] [stderr] error[E0433]: cannot find `option` in `core`
[INFO] [stderr]  --> crates/core/src/error.rs:6:10
[INFO] [stderr]   |
[INFO] [stderr] 6 | #[derive(Error, Debug)]
[INFO] [stderr]   |          ^^^^^ could not find `option` in `core`
[INFO] [stderr]   |
[INFO] [stderr]   = note: this error originates in the derive macro `Error` (in Nightly builds, run with -Z macro-backtrace for more info)
[INFO] [stderr] help: consider importing this module
[INFO] [stderr]   |
[INFO] [stderr] 3 + use std::option;
[INFO] [stderr]   |
[INFO] [stderr] 
[INFO] [stderr] error[E0433]: cannot find `fmt` in `core`
[INFO] [stderr]  --> crates/core/src/error.rs:6:10
[INFO] [stderr]   |
[INFO] [stderr] 6 | #[derive(Error, Debug)]
[INFO] [stderr]   |          ^^^^^ could not find `fmt` in `core`
[INFO] [stderr]   |
[INFO] [stderr]   = note: this error originates in the derive macro `Error` (in Nightly builds, run with -Z macro-backtrace for more info)
[INFO] [stderr] help: consider importing this module
[INFO] [stderr]   |
[INFO] [stderr] 3 + use std::fmt;
[INFO] [stderr]   |
[INFO] [stderr] 
[INFO] [stderr] error[E0433]: cannot find `convert` in `core`
[INFO] [stderr]  --> crates/core/src/error.rs:6:10
[INFO] [stderr]   |
[INFO] [stderr] 6 | #[derive(Error, Debug)]
[INFO] [stderr]   |          ^^^^^ could not find `convert` in `core`
[INFO] [stderr]   |
[INFO] [stderr]   = note: this error originates in the derive macro `Error` (in Nightly builds, run with -Z macro-backtrace for more info)
[INFO] [stderr] help: consider importing this module
[INFO] [stderr]   |
[INFO] [stderr] 3 + use std::convert;
[INFO] [stderr]   |
[INFO] [stderr] 
[INFO] [stderr] error: aborting due to 4 previous errors
[INFO] [stderr] 
[INFO] [stderr] For more information about this error, try `rustc --explain E0433`.
[INFO] [stderr] error: doctest failed, to rerun pass `-p core --doc`
[INFO] [stderr] 
[INFO] [stderr] Caused by:
[INFO] [stderr]   process didn't exit successfully: `/opt/rustwide/rustup-home/toolchains/cced03bfd61a304243a34504618ecec86c17063f/bin/rustdoc --edition=2021 --crate-type lib --color auto --crate-name core --test crates/core/src/lib.rs --test-run-directory /opt/rustwide/workdir/crates/core -L native=/opt/rustwide/target/debug/build/ring-1b178c60421d37e6/out -L native=/opt/rustwide/target/debug/build/zstd-sys-0c8bf97a46373736/out --extern anyhow=/opt/rustwide/target/debug/deps/libanyhow-d0824aa9c7568042.rlib --extern arc_swap=/opt/rustwide/target/debug/deps/libarc_swap-36a94ed20f10610e.rlib --extern async_trait=/opt/rustwide/target/debug/deps/libasync_trait-5e6c8dc165503e7e.so --extern bincode=/opt/rustwide/target/debug/deps/libbincode-a20b3e237895d9aa.rlib --extern bitvec=/opt/rustwide/target/debug/deps/libbitvec-7b6d799c6dcd1507.rlib --extern bytes=/opt/rustwide/target/debug/deps/libbytes-ff5aca13e3e348ea.rlib --extern common=/opt/rustwide/target/debug/deps/libcommon-d39b08afc0256681.rlib --extern core=/opt/rustwide/target/debug/deps/libcore-57ab556489f56775.rlib --extern dashmap=/opt/rustwide/target/debug/deps/libdashmap-3577b8b73f838f63.rlib --extern futures=/opt/rustwide/target/debug/deps/libfutures-44351f7c22b1b919.rlib --extern hex=/opt/rustwide/target/debug/deps/libhex-28742b4ca144387c.rlib --extern if_addrs=/opt/rustwide/target/debug/deps/libif_addrs-466a5d4d10e79fc1.rlib --extern igd_next=/opt/rustwide/target/debug/deps/libigd_next-1d1e4cd898a926bb.rlib --extern lru=/opt/rustwide/target/debug/deps/liblru-7b48ae7844465982.rlib --extern parking_lot=/opt/rustwide/target/debug/deps/libparking_lot-dd9b68a5c81df5f6.rlib --extern rand=/opt/rustwide/target/debug/deps/librand-e1992c35741266cf.rlib --extern reqwest=/opt/rustwide/target/debug/deps/libreqwest-0836ea0319229b0a.rlib --extern serde=/opt/rustwide/target/debug/deps/libserde-644b9894b1629dec.rlib --extern serde_json=/opt/rustwide/target/debug/deps/libserde_json-7a29ab19d0bd680b.rlib --extern sha1=/opt/rustwide/target/debug/deps/libsha1-472f8d904dca6d47.rlib --extern socket2=/opt/rustwide/target/debug/deps/libsocket2-f97ae72aeb8659a3.rlib --extern thiserror=/opt/rustwide/target/debug/deps/libthiserror-fb02d81ecd3e316d.rlib --extern tokio=/opt/rustwide/target/debug/deps/libtokio-0fa548e7453e8673.rlib --extern tracing=/opt/rustwide/target/debug/deps/libtracing-a30bb2ec37abb4da.rlib --extern url=/opt/rustwide/target/debug/deps/liburl-1490a478010fa7f9.rlib --extern urlencoding=/opt/rustwide/target/debug/deps/liburlencoding-2e57689ab08a86e0.rlib --extern uuid=/opt/rustwide/target/debug/deps/libuuid-7f8e724a79016598.rlib -L dependency=/opt/rustwide/target/debug/deps -C embed-bitcode=no --cfg 'feature="default"' --cfg 'feature="upnp"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("default", "upnp"))' --cap-lints=forbid --error-format human` (exit status: 1)
[INFO] [stderr] note: test exited abnormally; to see the full output pass --no-capture to the harness.
[INFO] running `Command { std: "docker" "inspect" "d03a9b6672eb303bcace6d9a53988ce43cce9ea065763c634e7223ab90e1fd87", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "d03a9b6672eb303bcace6d9a53988ce43cce9ea065763c634e7223ab90e1fd87", kill_on_drop: false }`
[INFO] [stdout] d03a9b6672eb303bcace6d9a53988ce43cce9ea065763c634e7223ab90e1fd87
